GetModuleHandle函數

VC聲明:

       HMODULE GetModuleHandle (LPCTSTR lpModuleName); 
  功能說明 
  獲取一個應用程序或動態鏈接庫的模塊句柄 
  參數說明 
  lpModuleName 模塊名稱 
  返回值 
  如執行成功成功,則返回模塊句柄。零表示失敗。通過GetLastError獲得錯誤信息 
  如: 
       GetModuleHandle(NULL); //  這將返回自身應用程序句柄

            GetModuleHandle("kernel32");//這將返回kernel32.dll的句柄

模塊句柄實際上就是模塊在當前進程空間的裝入地址。exe程序裝入句柄一般爲 0x00400000 。所以GetModuleHandle(NULL); 返回的值爲  0x00400000;GetModuleHandle("kernel32");返回值是0x7c800000(這個值正是kernel32.dll中的Image base的值)。

註釋:
返回句柄不是全局的或可繼承的。它不能被其它進程複製或使用。  假如lpModuleName沒有包含路徑,而且有多個相同的文件名和擴展名,將不能預測返回哪一個模塊的句柄。要解決這個問題,需要指定路徑。用side-by-side assemblies指定,或用GetModuleHandleEx來指定一個內存區而不是一個DLL名。  GetModuleHandle函數對一個映像的模塊返回一個句柄,而不會增加引用(reference)數。然而,在傳遞這個句柄給FreeLibrary函數時,要當心,因爲,這樣傳遞會導致一個DLL模塊過早地不能被映像。  這個函數在多線程程序中必須謹慎使用。不能保證這個模塊句柄在函數返回時和使用時是有效的。比如,一個線程得到模塊句柄,但在使用這個句柄之前,第二個線程釋放了這個模塊。假如這個系統載入另一個模塊,它可以再次使用最近釋放了的句柄。然而,第一個線程擁有一個模塊的句柄,這個模塊不同於先前那個模塊。

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