0

我有以下用于制作 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);
      };
    }

现在我想将该 dll 链接到另一个 c++ 代码中。因此我使用该代码:

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 的值未在函数调用中正确保存。这通常是调用使用一种调用约定声明的函数和使用另一种调用约定声明的函数指针的结果。

为什么?非常感谢。

4

1 回答 1

0

blubb::setCallback默认为__cdecl并且您将其称为__stdcall. 尝试在您的 DLL 中将其声明为:

static __declspec(dllexport) void __stdcall setCallback(event evnHnd);
于 2012-11-09T18:14:15.127 回答