我得到了MyDll.dll和它的函数,定义如下
void pascal Myfunction(BOOL);当我试图在另一个项目中使用该函数时,我无法使用GetProcAddress()获取该函数的地址。下面是我的代码:
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);
}我得到的输出如下:
DLL Loaded
Function not loaded但是当我尝试使用像Glu32.dll这样的已知DLL和它的函数时,它工作得很好。
我想可能是它的功能有问题,比如
void pascal MyFunction(BOOL);在这方面,有人能帮我吗?
发布于 2012-01-25 19:10:12
您需要使用extern "C"来防止名称损坏,并确保函数被导出:
extern "C" __declspec(dllexport) void Myfunction(BOOL);要查看DLL中的导出,您可以使用Visual Studio附带的dumpbin.exe实用程序:
dumpbin.exe /EXPORTS MyDll.dll这将列出所有导出符号的名称。
除此之外,请不要指定以下编译器开关:
Gz __stdcall calling convention: "Myfunction" would be exported as Myfunction@4
Gr __fastcall caling convention: "Myfunction" would be exported as @Myfunction@4注意:我认为最后一个符号依赖于编译器版本,但仍然不只是"Myfunction“。
发布于 2012-01-25 19:17:20
DLL导出过程会受到名称损坏和修饰的影响。长期过时的16位pascal调用约定等同于32位平台上的stdcall。
首先,您应该使用extern "C"来指定C链接,并禁用名称损坏。
但是,您的函数仍将受制于name decoration。如果您使用__declspec(dllexport)导出它,那么它实际上将以_Myfunction@4的名称导出。如果您希望按其真实名称导出它,则需要使用.def文件。
但是,您仍然有可能根本没有从DLL中导出函数。使用Dependency Walker检查它是否已导出,如果是,使用的名称是什么。
发布于 2012-01-25 19:05:34
为什么要使用pascal调用约定?也许这会改变符号的名称,如果是这样,您可能需要考虑到这一点。
https://stackoverflow.com/questions/9001619
复制相似问题