我有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 ...)
最佳答案
从DllMain内部调用LoadLibrary是not recommended。修复此问题,您的循环加载问题也将消失。
BTW DLL2不需要加载DLL1。它可以使用GetModuleHandle
查找已加载的DLL传递给GetProcAddress
,使用静态导入,或者DLL1可以调用DLL2导出的函数并传递一个函数指针。
LoadLibrary
的特定注释:http://blog.barthe.ph/2009/07/30/no-stdlib-in-dllmai/ 关于c++ - 如何从加载器DLL获取函数地址?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21194336/