1. 程式人生 > >動態呼叫DLL. LoadLibrary和GetProcAddress

動態呼叫DLL. LoadLibrary和GetProcAddress

動態引入方式就是使用Windows的兩個API即LoadLibrary和GetProcAddress,前者用於獲得DLL的控制代碼,後者用於獲得DLL中例程的地址,這種方式之所以被稱為動態的,是因為它不需要在程式的開始處把要引入的例程全部列出,只要在呼叫前引入,並且LoadLibrary可以指定不同的DLL,GetProcAddress可以指定不同的例程,最重要的是如果指定的DLL出錯,最多是API呼叫失敗,但不會導致程式終止,因此我們應該在程式中監視DLL的返回值,根據返回值作出相應的處理。如
typedef wstring(* PROCINIT)(int&);
(原型 wstring OutlookInit(int& a);)
 PROCINIT m_pProcInit;
 hinstOutlook = LoadLibrary(TEXT("OLInterface")); 
 if (hinstOutlook != NULL) 
    { 
        m_pProcInit = (PROCINIT) GetProcAddress(hinstOutlook, TEXT("OutlookInit"));
  ProcDeInit = (PROCDEINIT) GetProcAddress(hinstOutlook, TEXT("OutlookDeInit"));
  ProcMail = (PROCMAIL) GetProcAddress(hinstOutlook, TEXT("OutlookCheckMail"));
  ProcAppoint = (PROCAPPOINT) GetProcAddress(hinstOutlook, TEXT("OutlookCheckAppointments"));
 }
使用 :
int aa = 100;
wstring sTmp = m_pProcInit(aa);

程序呼叫 LoadLibrary(或 AfxLoadLibrary)以顯式連結到 DLL。如果成功,函式將指定的 DLL 對映到呼叫程序的地址空間中並返回此 DLL 的控制代碼,該控制代碼可與用於顯式連結的其他函式(如 GetProcAddress 和 FreeLibrary)一起使用。

LoadLibrary

LoadLibrary 嘗試使用用於隱式連結的同一搜尋序列來定位 DLL。如果系統無法找到 DLL 或者入口點函式返回 FALSE,LoadLibrary 將返回 NULL。如果對 LoadLibrary 的呼叫所指定的 DLL 模組已對映到呼叫程序的地址空間中,則函式僅返回 DLL 的控制代碼並遞增模組的引用數。

如果 DLL 有入口點函式,則作業系統在呼叫 LoadLibrary 的程序上下文中呼叫此函式。如果由於以前呼叫了 LoadLibrary 但沒有相應地呼叫 FreeLibrary 函式而導致 DLL 已經附加到程序,則不會呼叫此入口點函式。

載入擴充套件 DLL 的 MFC 應用程式應使用 AfxLoadLibrary 而不是 LoadLibrary。AfxLoadLibrary 在呼叫 LoadLibrary 之前處理執行緒同步。AfxLoadLibrary 的介面(函式原型)與 LoadLibrary 相同。

如果出於某種原因 Windows 無法載入 DLL,程序可以嘗試從錯誤恢復。例如,程序可通知使用者所發生的錯誤,並讓使用者指定 DLL 的其他路徑。

安全說明 如果程式碼將在 Windows NT 4 或 Windows 2000 上執行,請務必要指定任何 DLL 的完整路徑名。