【问题标题】:Call C++ function from inside dynamically loaded dll从动态加载的 dll 内部调用 C++ 函数
【发布时间】:2020-08-26 21:46:41
【问题描述】:

我正在编写一个 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)__declspec(dllexport) 属性的信息,但我对 C++ 非常陌生,不确定这些是否适合使用,如果适合,如何使用它们。

【问题讨论】:

    标签: c++ c dll declspec


    【解决方案1】:

    在您的 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" and extern "C++" function declarationsExporting from a DLL Using __declspec(dllexport) Importing function calls using __declspec(dllimport)

    【讨论】:

    • DLL_PROCESS_ATTACH 不在控制台输出中,对吧?
    • 那我是不是理解对了:主程序加载dll时调用DllMain函数?这是否意味着我必须在此函数调用期间初始化我想使用的所有外部函数?
    • DllMain 在加载 dll 时被调用。您不必在 DllMain 中初始化函数,您可以在 DllMain 之外初始化它们,如下所示:callableFromDll func = (callableFromDll)GetProcAddress(GetModuleHandle(NULL), "callableFromDll");
    猜你喜欢
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 2023-03-24
    • 2011-09-06
    • 1970-01-01
    • 2010-09-30
    • 2012-12-29
    • 1970-01-01
    相关资源
    最近更新 更多