我有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>
答案 0 :(得分:0)
从DllMain内部调用LoadLibrary是not recommended。解决这个问题,你的循环加载问题也会消失。
BTW DLL2不需要加载DLL1。它可以使用GetModuleHandle
查找已经加载的DLL传递给GetProcAddress
,使用静态导入,或者DLL1可以调用从DLL2导出的函数传递函数指针。
LoadLibrary
:http://blog.barthe.ph/2009/07/30/no-stdlib-in-dllmai/ 答案 1 :(得分:0)
你不想在DllMain中使用LoadLibrary
。根据{{3}} Microsoft页面明确禁止在DllMain中使用LoadLibrary
。此外,this仅在当前进程已加载DLL时才有效。
您确定需要从DllMain加载DLL吗?您可以从导出的函数中调用GetModuleHandle
,当然假设模块已经由程序加载。