1

我正在编写一个 C++ 程序,它在运行时动态加载一个 dll 并在该 dll 中调用一个函数。那工作正常,但现在我想从 dll 中调用我的 C++ 程序中定义的函数。

我的 main.cpp 看起来像这样:

#include <Windows.h>
#include <iostream>

typedef void(*callC)(int);

int main()
{
    HINSTANCE dllHandle = LoadLibrary("D:\Libraries\lib.dll");

    callC func = (callC)GetProcAddress(dllHandle, "callC");

    func(42);

    FreeLibrary(dllHandle);
}

// I want to call this function from my dll
void callableFromDll(){
}

被访问的 dll 部分是用 C 语言编写的,如下所示:

#include <stdio.h>

void callC(int);

void callC(int i){
    print(i);

    // Call the C++ function
    //callableFromDll();
}

我已经阅读了__declspec(dllimport)and__declspec(dllexport)属性,但我对 C++ 真的很陌生,并且不确定这些是否是正确的使用方法,如果是,如何使用它们。

4

1 回答 1

5

在您的 C++ 程序中:

extern "C" _declspec(dllexport) void callableFromDll(int value) {
    printf("This function was called from the main process. Value: %d\n", value);
}

在您的 DLL 中:

typedef void(*callableFromDll)(int);
callableFromDll func;

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        func = (callableFromDll)GetProcAddress(GetModuleHandle(NULL), "callableFromDll");
        func(69);
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:

        break;
    }
    return TRUE;
}
GetModuleHandle(NULL)

返回父级的可执行句柄。

LoadLibrary 加载 DLL 时 exe 的控制台输出:

This function was called from the main process. Value: 69

cppfunction.exe (process 16336) exited with code 0.
Press any key to close this window . . .

extern "C"告诉编译器不要将函数的名称编码为唯一的名称。编译器对名称进行编码,以便链接器可以分隔常用函数或变量名称。

请参阅extern "C" 和 extern "C++" 函数声明使用 __declspec(dllexport) 从 DLL 导出使用 __declspec(dllimport) 导入函数调用

于 2020-05-11T12:54:26.457 回答