C ++中的GetProcAddress函数

时间:2011-05-17 13:24:41

标签: c++ dll loadlibrary getprocaddress

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

中使用此函数(双GetNumber(double x))

这是我使用的代码:

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

3 个答案:

答案 0 :(得分:43)

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

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

检查hDLL。它是NULL吗?如果是这样,请致电GetLastError()以找出原因。它可能就像“未找到文件”一样简单。

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

如果lpGetNumber为NULL,请致电GetLastError()。它会告诉你为什么无法找到proc地址。有几种可能的情况:

  1. 没有名为GetNumber
  2. 导出函数
  3. 有一个名为GetNumber的导出函数,但未标记为extern "c",导致name mangling
  4. hDLL不是有效的库句柄。
  5. 如果结果是#1,则需要通过__declspec(dllexport)装饰声明来导出函数,如下所示:

    MyFile.h

    __declspec(dllexport) int GetNumber();
    

    如果结果是#2,则需要执行此操作:

    extern "C"
    {
      __declspec(dllexport) int GetNumber();
    };
    

答案 1 :(得分:2)

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

  

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

修改

我们不知道你是如何在DLL代码上导出函数的,但是this thread解释了为什么GetProcAddress失败的原因。

答案 2 :(得分:2)

您可能想要检查GetNumber功能是否导出为__stdcall功能。

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

参考:__stdcall