首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于GetProcAddress

关于GetProcAddress
EN

Stack Overflow用户
提问于 2012-01-25 19:03:19
回答 4查看 2.8K关注 0票数 0

我得到了MyDll.dll和它的函数,定义如下

代码语言:javascript
复制
void pascal Myfunction(BOOL);

当我试图在另一个项目中使用该函数时,我无法使用GetProcAddress()获取该函数的地址。下面是我的代码:

代码语言:javascript
复制
void callMyDll()
{
 HINSTANCE hDll;

 hDll=LoadLibrary(_T("MyDll.dll");

 if(hDll!=NULL)
 {
  cout<<"\n DLL Loaded \n";
 }
 else
  cout<<"\n DLL Not loaded\n"

 typedef void (__stdcall *MyFunction)(bool)

 Myfunction mf1 = (MyFunction) GetProcAddress(hDll, "MyFunction");

 if (mf1!=NULL)
  cout<<"\n Function Loaded Successfully \n";
 else
  cout<<"\n Function not loaded \n";

 FreeLibrary(hDll);
}

我得到的输出如下:

代码语言:javascript
复制
DLL Loaded
Function not loaded

但是当我尝试使用像Glu32.dll这样的已知DLL和它的函数时,它工作得很好。

我想可能是它的功能有问题,比如

代码语言:javascript
复制
void pascal MyFunction(BOOL);

在这方面,有人能帮我吗?

EN

回答 4

Stack Overflow用户

发布于 2012-01-25 19:10:12

您需要使用extern "C"来防止名称损坏,并确保函数被导出:

代码语言:javascript
复制
extern "C" __declspec(dllexport) void Myfunction(BOOL);

要查看DLL中的导出,您可以使用Visual Studio附带的dumpbin.exe实用程序:

代码语言:javascript
复制
dumpbin.exe /EXPORTS MyDll.dll

这将列出所有导出符号的名称。

除此之外,请不要指定以下编译器开关:

代码语言:javascript
复制
Gz __stdcall calling convention: "Myfunction" would be exported as Myfunction@4
Gr __fastcall caling convention: "Myfunction" would be exported as @Myfunction@4

注意:我认为最后一个符号依赖于编译器版本,但仍然不只是"Myfunction“。

票数 2
EN

Stack Overflow用户

发布于 2012-01-25 19:17:20

DLL导出过程会受到名称损坏和修饰的影响。长期过时的16位pascal调用约定等同于32位平台上的stdcall

首先,您应该使用extern "C"来指定C链接,并禁用名称损坏。

但是,您的函数仍将受制于name decoration。如果您使用__declspec(dllexport)导出它,那么它实际上将以_Myfunction@4的名称导出。如果您希望按其真实名称导出它,则需要使用.def文件。

但是,您仍然有可能根本没有从DLL中导出函数。使用Dependency Walker检查它是否已导出,如果是,使用的名称是什么。

票数 1
EN

Stack Overflow用户

发布于 2012-01-25 19:05:34

为什么要使用pascal调用约定?也许这会改变符号的名称,如果是这样,您可能需要考虑到这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9001619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档