在 C 和 return 函数指针中调用 GetModuleHandle 的正确方法
Correct way to call GetModuleHandle in C and return function pointer
我正在从 C 调用 DLL,但是当我调用 GetProcAddress 时,GCC 说:
warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
DLL 使用指向双精度数组的指针和 returns 指向双精度数组的指针。这是 C 代码的相关部分:
typedef double* (*dllfunc1)(double*);
double *return_pointer;
hinstLib = LoadLibrary(dllname);
dll_handle = GetModuleHandle(dllname);
return_pointer = (dllfunc1)(GetProcAddress(dll_handle, "Main_Entry_fn"));
最后一行失败了。我尝试了多种不同的排列,但 none 奏效了。网上有大量关于函数指针的 typedef 原型的信息,但在 GetProcAddress 上下文中调用 DLL 函数的信息很少。
当我将 return_pointer 的定义更改为:
int return_pointer
我得到:
warning: assignment makes integer from pointer without a cast
所以看起来问题出在变量 "return_pointer." 很可能需要将其定义为 int 并转换为指针,但我无法将其转换为指针。最初的定义 (*double) 是因为它 returns 是一个指向双精度数组的指针。
我哪里错了?任何想法将不胜感激。谢谢。
我相信你的代码应该是这样的:
typedef double *(*dllfunc1)(double *);
HANDLE dll_handle = LoadLibrary(dllname);
dllfunc1 Main_Entry_fn = (dllfunc1)(GetProcAddress(dll_handle, "Main_Entry_fn"));
double *result = Main_Entry_fn(argument);
dllfunc1
是指向函数的指针类型,它是指向函数变量的正确类型,它将保存 GetProcAddress
返回的指针。 double *
只是 Main_Entry_fn
返回的指针类型,因此这是保存 实际调用 Main_Entry_fn
结果的变量的正确类型.
此外,如果我没有正确阅读 MSDN,您不需要同时调用 LoadLibrary
和 GetModuleHandle
;一个就够了。
此外,如果您在按名称查找的函数之后命名指向函数的指针,将会减少混淆。
此外,指针星号绑定到右侧,所以永远不要将它们抱在左侧,即使您正在编写 C++。
我正在从 C 调用 DLL,但是当我调用 GetProcAddress 时,GCC 说:
warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
DLL 使用指向双精度数组的指针和 returns 指向双精度数组的指针。这是 C 代码的相关部分:
typedef double* (*dllfunc1)(double*);
double *return_pointer;
hinstLib = LoadLibrary(dllname);
dll_handle = GetModuleHandle(dllname);
return_pointer = (dllfunc1)(GetProcAddress(dll_handle, "Main_Entry_fn"));
最后一行失败了。我尝试了多种不同的排列,但 none 奏效了。网上有大量关于函数指针的 typedef 原型的信息,但在 GetProcAddress 上下文中调用 DLL 函数的信息很少。
当我将 return_pointer 的定义更改为:
int return_pointer
我得到:
warning: assignment makes integer from pointer without a cast
所以看起来问题出在变量 "return_pointer." 很可能需要将其定义为 int 并转换为指针,但我无法将其转换为指针。最初的定义 (*double) 是因为它 returns 是一个指向双精度数组的指针。
我哪里错了?任何想法将不胜感激。谢谢。
我相信你的代码应该是这样的:
typedef double *(*dllfunc1)(double *);
HANDLE dll_handle = LoadLibrary(dllname);
dllfunc1 Main_Entry_fn = (dllfunc1)(GetProcAddress(dll_handle, "Main_Entry_fn"));
double *result = Main_Entry_fn(argument);
dllfunc1
是指向函数的指针类型,它是指向函数变量的正确类型,它将保存 GetProcAddress
返回的指针。 double *
只是 Main_Entry_fn
返回的指针类型,因此这是保存 实际调用 Main_Entry_fn
结果的变量的正确类型.
此外,如果我没有正确阅读 MSDN,您不需要同时调用 LoadLibrary
和 GetModuleHandle
;一个就够了。
此外,如果您在按名称查找的函数之后命名指向函数的指针,将会减少混淆。
此外,指针星号绑定到右侧,所以永远不要将它们抱在左侧,即使您正在编写 C++。