在这个伟大的平台上阅读和学习多年后,现在是我的第一篇文章。DLL调用约定和访问冲突
我的问题:
在C++中,我试图创建一个动态链接库(32位),将作为一个AQMP通信客户端(基于SimpleAmqpClient)。该dll文件将在第三方应用程序(32位)中使用。
在我的测试中,我在自定义可执行文件中调用dll时,一切正常。但是,当我尝试在第三方应用程序中使用DLL时,出现访问冲突错误(0x00000000)。我发现问题可能是函数调用约定。
下面介绍的几行代码可以重现错误。如果我删除mytest.dll中的__stdcall
表达式,它会消失。通常我会希望代码工作,因为它在custom_test.exe和mytest.dll中使用相同的调用约定。 (旁注:第三方应用程序预计__stdcall
函数,这就是为什么我依靠它)
我想了解这种行为。提前致谢!
我的设定:
- 操作系统:Windows 7
- 32位编译器:GCC 5.3(Cygwin的)
我的代码(custom_test.exe):
#include <stdio.h>
#include <windows.h>
int main(void) {
HINSTANCE hInstance;
hInstance=LoadLibrary("mytest.dll");
FARPROC lpfnGetProcessID = GetProcAddress(HMODULE(hInstance), "test");
// Function prototype
typedef void (__stdcall *myFunction)(void);
myFunction test;
test = myFunction(lpfnGetProcessID);
// Call Function
test();
FreeLibrary(hInstance);
}
我的代码(mytest.dll):
extern "C" __declspec(dllexport) void __stdcall test(void) {
printf("Inside Function \n");
}
我通过编译代码
- DLL:
g++ mytest.cpp -o mytest.dll -shared -std=gnu++11
- EXE:
g++ custom_test.cpp -o custom_test.exe -std=gnu++11
Thx为您的答复!在我的第一篇文章中,我只想展示我的任务的全貌。错误可以通过给定的代码进行再现,而不需要任何进一步的依赖(第三方库或应用程序)。 – wolfspex
更新了答案 - 请参阅编辑 –