2014-01-17 48 views
2

我有2個DLL。 DLL1將顯示爲MyDLL.dll,而DLL2只是一個包含MyDLL擴展名的DLL。 因此,要將這些擴展從DLL2擴展到MyDLL,我需要使用LoadLibrary()在MyDLL中加載DLL2。但問題來了。 MyDLL包含一個函數,這在DLL2中非常重要。我需要達到這個功能。我該怎麼做?如何從加載程序DLL獲取函數地址?

#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"); 
    } 
} 

另一件事是,我很害怕使用調用LoadLibrary( 「MYDLL.DLL」)內DLL2,因爲我認爲這會造成一個大無限循環調用LoadLibrary(MYDLL => DLL 2 => MYDLL ... )

+1

先加載DLL1,然後加載DLL2;在DLL2中添加一個函數'setupCore(void(* funtion_ptr)())'(或類似的東西),並將所需函數的地址從DLL1傳遞給該函數。 – Gasim

+0

好主意!真的! – jakubinf

回答

0

從DllMain調用LoadLibrary的方法是not recommended。修復這個問題,你的循環加載問題也會消失。

BTW DLL2不需要加載DLL1。它可以使用GetModuleHandle查找已加載的DLL傳遞給GetProcAddress,使用靜態導入,或者DLL1可以調用從DLL2導出的函數傳遞函數指針。

+1

IMO,DLL2應該調用LoadLibrary來遞增加載器引用計數,除非不會在什麼時候調用哪個函數時出現混淆。 – JimR

0

你是對的不希望在DllMain中使用LoadLibrary。在DllMain中使用LoadLibrary明確禁止根據this Microsoft頁面。而且,GetModuleHandle僅在當前進程已加載DLL的情況下有效。

你真的確定你需要從你的DllMain加載DLL嗎?您可以從導出的函數中調用GetModuleHandle,假設模塊已經被程序加載了。