【问题标题】:How to get function address from loader DLL?如何从加载器 DLL 中获取函数地址?
【发布时间】:2014-02-07 06:45:21
【问题描述】:

我有 2 个 DLL。 DLL1 将显示为 MyDLL.dll,而 DLL2 只是一个包含 MyDLL 扩展的 DLL。 因此,要将这些扩展从 DLL2 获取到 MyDLL,我需要使用 LoadLibrary() 在 MyDLL 中加载 DLL2。但问题来了。 MyDLL 包含一个函数,这在 DLL2 中将非常重要。我需要达到那个功能。我该怎么做?

#include <Windows.h>
#include <stdio.h>
#include "DLL1API.h"

typedef DLL1API* (*PGetDLL1API)();

DLL1API *g_API;
void Init();
BOOL WINAPI DllMain(HINSTANCE hMod, DWORD dwReason, LPVOID reserve){
    switch(dwReason){
    case DLL_PROCESS_ATTACH:
        Init();
        break;
    }
}
void Init(){
    PGetDLL1API GetDLL1API;
    HMODULE mainDllMod=GetModuleHandleA("MyDLL.dll"); //how do I reach module of DLL1?
    GetDLL1API=(PGetDLL1API)GetProcAddress(mainDllMod,"GetDLL1API");
    if(GetDLL1API){
        g_API=GetDLL1API();
        printf("DLL1API: %p",g_API);
    } else { //always gets to this result :(
        printf("Error, failed to get GetDLL1API()!\n");
    }
}

另一件事是,我害怕在 DLL2 中使用 LoadLibrary("MyDLL.dll"),因为我认为它会导致一个巨大的无限 loadLibrary 循环(MyDll => DLL2 => MyDLL ...)

【问题讨论】:

  • 先加载DLL1,再加载DLL2;在 DLL2 中添加一个函数 setupCore(void (*funtion_ptr)())(或类似的东西),并将所需函数的地址从 DLL1 传递给它。

标签: c++ winapi dll


【解决方案1】:

从 DllMain 内部调用 LoadLibrary 是 not recommended。解决这个问题,您的循环加载问题也将消失。

顺便说一句,DLL2 不需要加载 DLL1。它可以使用GetModuleHandle 找到已经加载的DLL 并传递给GetProcAddress,使用静态导入,或者DLL1 可以调用从DLL2 导出的函数并传递函数指针。

【讨论】:

  • IMO,DLL2 应该调用 LoadLibrary 来增加加载程序引用计数,除非在什么时候调用什么函数不会混淆。
【解决方案2】:

你不想在 DllMain 中使用LoadLibrary 是对的。根据this Microsoft 页面,明确禁止在 DllMain 中使用 LoadLibrary。此外,GetModuleHandle 仅在 DLL 已被当前进程加载时才有效。

您确定需要从 DllMain 加载 DLL 吗?你可以从你导出的函数中调用GetModuleHandle,当然假设模块已经被程序加载了。

【讨论】:

    猜你喜欢
    • 2014-02-18
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 2018-04-21
    相关资源
    最近更新 更多