我有以下用于制作dll的c ++代码(只是其中的一部分):
#include <windows.h>
#include <stdint.h>
using namespace std;
typedef int (__stdcall *event)(unsigned int id, int value);
BOOL WINAPI DllMain(HINSTANCE hModule, DWORD dwFunction, LPVOID lpReserved);
namespace Bla
{
class blubb
{
public:
static __declspec(dllexport) void setCallback(event evnHnd);
};
}
现在我想在另一个c ++代码中链接该dll。因此我使用该代码:
typedef int (__stdcall *event)(unsigned int id, int value);
typedef void (__stdcall *setCallback)(eventCallback evHnd);
int __stdcall valuesDll( unsigned int id, int value)
{
std::cout << "id::value == " << id << "::" << value << std::endl;
return 0;
}
int _tmain()
{
HINSTANCE hDLL = LoadLibrary(_T("test"));
if(hDLL == NULL)
{
std::cout << "dll not loaded.\n";
}
else
{
std::cout << "DLL loaded.\n";
setCallback values = (setCallback)GetProcAddress(hDLL, "setCallback");
if(NULL != values)
{
values(&valuesDll);
}
FreeLibrary(hDLL);
}
return 0;
}
但现在我收到了错误:
ESP的值未在函数调用中正确保存。这通常是调用使用一个调用约定声明的函数的结果,函数指针使用不同的调用约定声明。
为什么呢? 非常感谢你。
答案 0 :(得分:0)
blubb::setCallback
默认为__cdecl
,您可以将其称为__stdcall
。尝试在DLL中将其声明为:
static __declspec(dllexport) void __stdcall setCallback(event evnHnd);