C++ 从dll调用函数到exe c++;

C++ 从dll调用函数到exe c++;,c++,dll,C++,Dll,我有一个测试dll。在dll中发生事件后,我希望使用从dll到exe的回调函数 test.dll h .cpp 迈克斯 .cpp 装载 hLib=LoadLibrary(L"test.dll"); if(hLib==NULL) { ... return -1; } callSumFn callSum = (callSumFn)GetProcAddress(hLib, L"_callSum@8"); if (!callSum

我有一个测试dll。在dll中发生事件后,我希望使用从dll到exe的回调函数

test.dll h

.cpp

迈克斯 .cpp

装载

  hLib=LoadLibrary(L"test.dll");
    if(hLib==NULL)
    {
       ...
       return -1;
    }


   callSumFn callSum = (callSumFn)GetProcAddress(hLib, L"_callSum@8");
    if (!callSum)
    {
        //cerr << "Failed to get function address" << endl;
        FreeLibrary(hLib);
        return 1;
    }

    callSum(3, 4);
hLib=LoadLibrary(L“test.dll”);
if(hLib==NULL)
{
...
返回-1;
}
callSumFn callSum=(callSumFn)GetProcAddress(hLib,L“_callSum@8");
如果(!callSum)
{

//cerr您已经在DLL中定义了变量函数
getSum
,但尚未声明它。在test.DLL中声明
getSum
应该可以避免错误。

您有一个循环依赖关系:exe依赖于DLL中的
callsum()
,DLL依赖于DLL中的
getSum()


如果需要回调,则需要定义函数指针,并将函数作为参数从exe传递给dll函数。

如果.h文件被破坏,它会将getSum()声明为
\uu declspec(dllexport)
。这仅在您构建DLL时为真,而在您构建测试时则不为真。然后是
dllimport
。使用宏在两者之间进行选择是样板文件。链接myexe.exe后,您还应该得到一个“myexe.lib”文件。将此文件添加到test.DLL的链接器命令中。
int  callSum(int a, int b)
{
    return getSum(a, b);
}
 extern "C" __declspec(dllexport)
int __stdcall getSum(int a, int b)
{
    return a + b;
}


typedef int(__stdcall * callSumFn)(int a, int b);
  hLib=LoadLibrary(L"test.dll");
    if(hLib==NULL)
    {
       ...
       return -1;
    }


   callSumFn callSum = (callSumFn)GetProcAddress(hLib, L"_callSum@8");
    if (!callSum)
    {
        //cerr << "Failed to get function address" << endl;
        FreeLibrary(hLib);
        return 1;
    }

    callSum(3, 4);