22

大家好:我已经在我的项目中加载了我的 DLL,但是每当我使用 GetProcAddress 函数时。它返回 NULL!我该怎么办?我在“MYDLL.dll”中使用这个函数( double GetNumber(double x) )

这是我使用的代码:

typedef double (*LPGETNUMBER)(double Nbr);
HINSTANCE hDLL = NULL;
LPGETNUMBER lpGetNumber;
hDLL = LoadLibrary(L"MYDLL.DLL");
lpGetNumber = (LPGETNUMBER)GetProcAddress((HMODULE)hDLL, "GetNumber");
4

3 回答 3

54

检查返回码和打电话GetLastError()会让你自由。您应该在这里检查两次返回码。您实际上是在零次检查返回码。

hDLL = LoadLibrary(L"MYDLL.DLL");

检查hDLL。它是空的吗?如果是这样,请致电GetLastError()了解原因。它可能就像“找不到文件”一样简单。

lpGetNumber = (LPGETNUMBER)GetProcAddress((HMODULE)hDLL, "GetNumber");

如果lpGetNumber为 NULL,则调用GetLastError(). 它会告诉你为什么找不到proc地址。有几种可能的情况:

  1. 没有名为的导出函数GetNumber
  2. 有一个名为的导出函数GetNumber,但没有标记extern "c",导致名称混乱
  3. hDLL不是有效的库句柄。

如果结果是上面的 #1,则需要通过使用以下方式装饰声明来导出函数__declspec(dllexport)

我的文件.h

__declspec(dllexport) int GetNumber();

如果结果是上面的#2,你需要这样做:

extern "C"
{
  __declspec(dllexport) int GetNumber();
};
于 2011-05-17T13:34:56.380 回答
4

您可能想检查您的GetNumber函数是否作为__stdcall函数导出。

如果是这样,请尝试GetProcAddress(hDLL, "_GetNumber@N");,其中N是 的GetNumber参数列表的总字节数。例如,如果您的函数签名是int GetNumber(int a, double b),那么它在 DLL 中的真实名称将是_GetNumber@12.

参考:__stdcall

于 2015-11-04T04:57:47.180 回答
3

很可能LoadLibrary()失败了。您只是看不到,因为显然您没有检查它返回的内容:

如果函数失败,则返回值为 NULL。要获取扩展错误信息,请调用 GetLastError。

编辑:

我们不知道您是如何在 DLL 代码上导出函数的,但该线程解释了 GetProcAddress 失败的几个原因。

于 2011-05-17T13:27:24.437 回答