動態調用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 的完整路徑名。



發佈了47 篇原創文章 · 獲贊 20 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章