【问题标题】:Correct way to call GetModuleHandle in C and return function pointer在 C 中调用 GetModuleHandle 并返回函数指针的正确方法
【发布时间】:2018-02-14 22:49:51
【问题描述】:

我从 C 调用一个 DLL,但是当我调用 GetProcAddress 时,GCC 说:

warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]

DLL 接受一个指向双精度数组的指针并返回一个指向双精度数组的指针。这是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) 是因为它返回一个指向双精度数组的指针。

我哪里错了?任何想法将不胜感激。谢谢。

【问题讨论】:

  • return_pointer 是保存指向函数本身的指针,还是保存函数返回的指针?在显示的代码中,您实际上还没有调用该函数。
  • (另外,我认为您不需要调用 LoadLibrary GetModuleHandle,只是其中一个,但我可能错了。)
  • 它保存了指向函数的指针,但在获得函数指针之前我无法调用该函数,这就是我遇到问题的地方。

标签: c dll function-pointers


【解决方案1】:

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

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++,也不要将它们抱在左侧。

【讨论】:

  • 谢谢,zwol。它的工作原理是它是 dllfunc1 return_pointer(不需要星号)。是的,确实不需要两者都调用。
猜你喜欢
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
  • 2019-08-16
  • 2012-02-02
  • 1970-01-01
  • 1970-01-01
  • 2017-03-25
  • 1970-01-01
相关资源
最近更新 更多