我从C调用DLL,但是当我调用GetProcAddress时,GCC说:
warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
DLL接受一个指向double数组的指针,并返回一个指向double数组的指针。以下是C代码的相关部分:
typedef double* (*dllfunc1)(double*);
double *return_pointer;
hinstLib = LoadLibrary(dllname);
dll_handle = GetModuleHandle(dllname);
return_pointer = (dllfunc1)(GetProcAddress(dll_handle, "Main_Entry_fn"));
最后一行是失败的。我尝试了许多不同的排列,但没有一个有效。关于函数指针的typedef原型在网上有相当多的信息,但在GetProcAddress的上下文中调用DLL函数的信息很少。
当我将return_pointer的定义更改为:
时int return_pointer
我明白了:
warning: assignment makes integer from pointer without a cast
所以看起来问题出在变量" return_pointer。"很可能它需要被定义为int并转换为指针,但我还没有能够将它转换为指针。原始定义(* double)是因为它返回一个指向double数组的指针。
我哪里错了?任何想法将非常感谢。谢谢。
答案 0 :(得分:3)
我相信你的代码应该是这样的:
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
返回的指针的类型,因此该变量的正确类型包含实际调用的结果 {{1} }。
此外,如果我正确阅读MSDN,您无需同时拨打Main_Entry_fn
和LoadLibrary
;一个或另一个就够了。
另外,如果在按名称查找的功能之后命名指向函数的指针,则不会产生混淆。
另外,指针星号也会绑定到右侧,所以即使您正在编写C ++,也不要将它们搂在左边。