在C中调用GetModuleHandle并返回函数指针的正确方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在C中调用GetModuleHandle并返回函数指针的正确方法相关的知识,希望对你有一定的参考价值。

我从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数组的指针。

我哪里错了?任何想法将非常感谢。谢谢。

答案

我相信你的代码应该是这样的:

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,你不需要同时调用LoadLibraryGetModuleHandle;一个或另一个就足够了。

另外,如果在按名称查找的函数之后命名指向函数的指针,则不会产生混淆。

还有,指针星号绑定到右边,所以即使你正在编写C ++,也不要将它们搂在左边。

以上是关于在C中调用GetModuleHandle并返回函数指针的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

C语言中函数调用怎么返回两个值

调用外部 SetWindowsHookEx 和 GetModuleHandle 的 PInvoke 错误

如果我不存储GetModuleHandle的返回值,是否需要关闭句柄?

如何确定函数调用正在使用哪个 Windows DLL?

PHP如何调用JS函数并获取其返回的数据?

c语言函数调用例子