C++ 导出函数,通过DLL强制转换为指针

C++ 导出函数,通过DLL强制转换为指针,c++,c,function-pointers,dllexport,C++,C,Function Pointers,Dllexport,这是对前面问题的阐述: 还有一个类似的问题,但我的答案与我的问题不符,我想举一些例子: 我有两组代码,我希望它们能做同样的事情,但是后者崩溃了。 使用mingw32和Win7 要导出的函数。这将被视为遗留和不可更改。 addxy.c addxy.h int addXY(int x, int y); 工作示例 main.c #include <stdio.h> #include "addxy.h" typedef int (__cdecl *addX

这是对前面问题的阐述:
还有一个类似的问题,但我的答案与我的问题不符,我想举一些例子:

我有两组代码,我希望它们能做同样的事情,但是后者崩溃了。 使用mingw32和Win7

要导出的函数。这将被视为遗留和不可更改。
addxy.c

addxy.h

    int addXY(int x, int y);
工作示例 main.c

    #include <stdio.h>
    #include "addxy.h"

    typedef int (__cdecl *addXYWrap_t)(int a, int b);

    addXYWrap_t addXYWrap = (addXYWrap_t)addXY;

    void main()
    {
      printf("result: %d", addXYWrap(3, 4));
    }
    #include <windows.h>
    #include <stdio.h>

    typedef int (__cdecl *func)(int a, int b);

    void main()
    {
      HINSTANCE loadedDLL = LoadLibrary("addxy.dll");

      if(!loadedDLL) {
        printf("DLL not loaded");
        return;
      } else {
        printf("DLL loaded\n");
      }

      func addition = (func)GetProcAddress(loadedDLL, "addXYWrap");

      if(!addition) {
        printf("Func not loaded");
        return;
      } else {
        printf("Func loaded\n");
      }

      printf("result: %d", addition(3, 4));
    }
崩溃的例子 addxydll.c

    #include <stdio.h>
    #include "addxy.h"

    typedef int (__cdecl *addXYWrap_t)(int a, int b);

    __declspec(dllexport) addXYWrap_t addXYWrap = (addXYWrap_t)addXY;
在它变成灰烬之前

坠机没有提供原因或原因的信息。
这是句法错误还是概念错误

int addXY(int x, int y)
{
  return x + y;
}
__declspec(dllexport) addXYWrap_t addXYWrap = (addXYWrap_t)addXY;
这是一个错误。您必须导出函数,而不是全局指针。就是

/* addxy.c */
__declspec(dllexport) int addXY(int x, int y)
{
  return x + y;
}
....
/* main.c */
func addition = (func)GetProcAddress(loadedDLL, "_addXY");
GetProcAddress
的调用返回
addXYWrap
的地址,而不是其值。由于
addXYWrap
是一个函数指针(与
func
的类型相同),这意味着它返回一个指向函数指针或
func*
的指针

尝试将该行更改为:

func addition = *(func*)GetProcAddress(loadedDLL, "addXYWrap");

或者,或者:

func* addition = (func*)GetProcAddress(loadedDLL, "addXYWrap");

然后,
(*添加)(3,4)
因此,根据上面的评论,您似乎想得太多了。如果确实需要函数指针,那么要正确调用它,必须首先取消引用
GetProcAddress
,如下所示:

func addition = *(func*)GetProcAddress(loadedDLL, "addXYWrap");
但是,更方便的解决方案是只包装函数:

__declspec(dllexport) int myAddXY(int x, int y)
{
    return addXY(x, y);
}

\uu declspec(dllexport)
用于指定导出函数。在这种情况下,您既不导入也不导出,因为您正在执行运行时查找,所以请删除说明符。
GetProcAddress(loadedDLL,“addXYWrap”)@immibis func已经是函数指针类型。@Olipro是的,在本例中GetProcAddress返回指向函数指针的指针。@immibis是的,正确。他应该导出函数本身,而不是函数指针。当然,他也可以取消引用
GetProcAddress()
结果。问题是如何从DLL而不是函数导出函数指针。你说得对!我用了第一种变体,谢谢。
func addition = *(func*)GetProcAddress(loadedDLL, "addXYWrap");
func* addition = (func*)GetProcAddress(loadedDLL, "addXYWrap");
func addition = *(func*)GetProcAddress(loadedDLL, "addXYWrap");
__declspec(dllexport) int myAddXY(int x, int y)
{
    return addXY(x, y);
}