从 .dll 访问 .exe 中定义的函数的正确方法

Aat*_*akA 3 c++ windows winapi

我有一个带有可执行文件和 DLL 的 VS 解决方案。

在可执行文件(MAIN)中:

__declspec(dllexport) void testExe()
{
    printf("Hello from EXE");
}

__declspec(dllimport) void DoStuff();

int main()
{
    DoStuff();
}
Run Code Online (Sandbox Code Playgroud)

在 .dll (DLL) 中

__declspec(dllimport) void testExe();

__declspec(dllexport) void testDll()
{
    printf("Hello from Dll");
}

__declspec(dllexport) void DoStuff()
{
    testExe();
    testDll();
}
Run Code Online (Sandbox Code Playgroud)

我在 MAIN.exe 中链接了 Dll.lib,但仍然收到链接错误:

error LNK2019: unresolved external symbol "__declspec(dllimport) void __cdecl testExe(void)" referenced in function "void __cdecl DoStuff(void)"
Run Code Online (Sandbox Code Playgroud)

我怎样才能实现这个目标?

Rem*_*eau 6

不要从 EXE 导出函数。从接受函数指针作为输入的 DLL 导出函数,然后让 EXE 在运行时调用该函数。

EXE文件:

__declspec(dllimport) void SetFunc(void (*)());
__declspec(dllimport) void DoStuff(); 

void testExe()
{
    printf("Hello from EXE");
}

int main()
{
    SetFunc(testExe);
    DoStuff();
}
Run Code Online (Sandbox Code Playgroud)

动态链接库:

typedef void (*lpFuncType)();

lpFuncType pExeFunc = NULL;

void testDll()
{
    printf("Hello from Dll");
}

__declspec(dllexport) void SetFunc(lpFuncType func)
{
    pExeFunc = func;
}

__declspec(dllexport) void DoStuff()
{
    if (pExeFunc) pExeFunc();
    testDll();
}
Run Code Online (Sandbox Code Playgroud)

  • 循环依赖是非常错误的。 (3认同)