C++ 中的 GetProcAddress 函数

发布于 2024-11-07 22:34:46 字数 360 浏览 6 评论 0原文

大家好:我已经在项目中加载了 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");

Hello guys: I've loaded my DLL in my project but whenever I use the GetProcAddress function. it returns NULL! what should I do?
I use this function ( double GetNumber(double x) ) in "MYDLL.dll"

Here is a code which I used:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

沧笙踏歌 2024-11-14 22:34:46

检查返回代码并调用 GetLastError() 将使您自由。您应该在此处检查返回代码两次。您实际上检查返回码零次。

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

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

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

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

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

如果结果是上面的#1,则需要通过用 __declspec(dllexport) 修饰声明来导出函数,如下所示:

MyFile.h

__declspec(dllexport) int GetNumber();

如果结果是上面的#2,则需要为此:

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

Checking return codes and calling GetLastError() will set you free. You should be checking return codes twice here. You are actually checking return codes zero times.

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

Check hDLL. Is it NULL? If so, call GetLastError() to find out why. It may be as simple as "File Not Found".

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

If lpGetNumber is NULL, call GetLastError(). It will tell you why the proc address could not be found. There are a few likely scenarios:

  1. There is no exported function named GetNumber
  2. There is an exported function named GetNumber, but it is not marked extern "c", resulting in name mangling.
  3. hDLL isn't a valid library handle.

If it turns out to be #1 above, you need to export the functions by decorating the declaration with __declspec(dllexport) like this:

MyFile.h

__declspec(dllexport) int GetNumber();

If it turns out to be #2 above, you need to do this:

extern "C"
{
  __declspec(dllexport) int GetNumber();
};
弥繁 2024-11-14 22:34:46

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

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

参考:__stdcall

You might want to check if your GetNumber function is exported as an __stdcall function.

If so, try GetProcAddress(hDLL, "_GetNumber@N");, where N is the total number of bytes of GetNumber's argument list. For example, if your function signature is int GetNumber(int a, double b), its real name in DLL will be _GetNumber@12.

Reference: __stdcall

少女的英雄梦 2024-11-14 22:34:46

最有可能的是 LoadLibrary() 失败。你只是看不到这一点,因为显然你没有检查它返回的内容:

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

编辑:

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

Most probably LoadLibrary() failed. You just can't see that because apparently you are not checking what it is returning:

If the function fails, the return value is NULL. To get extended error information, call GetLastError.

EDIT:

We don't know how you are exporting the function on the DLL code, but this thread explains a couple of reasons on why GetProcAddress fails.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文