大家好:我已经在我的项目中加载了我的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");
答案 0 :(得分:43)
检查返回代码并致电GetLastError()
会让您自由。你应该在这里检查两次返回代码。您实际上是在零次检查返回代码。
hDLL = LoadLibrary(L"MYDLL.DLL");
检查hDLL
。它是NULL吗?如果是这样,请致电GetLastError()
以找出原因。它可能就像“未找到文件”一样简单。
lpGetNumber = (LPGETNUMBER)GetProcAddress((HMODULE)hDLL, "GetNumber");
如果lpGetNumber
为NULL,请致电GetLastError()
。它会告诉你为什么无法找到proc地址。有几种可能的情况:
GetNumber
GetNumber
的导出函数,但未标记为extern "c"
,导致name mangling。hDLL
不是有效的库句柄。如果结果是#1,则需要通过__declspec(dllexport)
装饰声明来导出函数,如下所示:
__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");
,其中N
是GetNumber
参数列表的总字节数。例如,如果您的函数签名是int GetNumber(int a, double b)
,则其在DLL中的真实名称将为_GetNumber@12
。
参考:__stdcall