如何从加载器DLL获取函数地址?

时间:2014-01-17 19:34:21

标签: c++ winapi dll

我有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 =&gt; DLL2 =&gt; MyDLL ...)< / p>

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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