GetModuleHandle函數

 
GetModuleHandle函數
2007-08-17 14:01

當一個文件被映射到調用進程的地址空間時,GetModuleHandle函數得到其中某一模塊的句柄。  
使用GetModuleHandle函數格式:
HMODULE GetModuleHandle( LPCTSTR lpModuleName);  
  
參數  lpModuleName:
    
[in]用指針指向一個包含模塊名以NULL字符結尾的串,模塊是.dll或.exe文件。如果文件擴展名省略,則增加默認的擴展名.dll。文件名串可以是省略號(...),表示模塊名沒有擴展名。這個串不是必須指定一個路徑。當指定一個路徑時,確定要用反斜線(/),而不是斜線(/)。這個模塊名將和當前映射到調用進程地址空間的模塊名進行獨立地比較。    假如這個參數是NULL,函數將返回創建調用進程(.exe文件)的文件的句柄。 
 
返回值:  
如果函數調用成功,返回值是某一模塊的句柄。  如果函數調用失敗,返回NULL。要得知更多的出錯信息,調用GetLastError。 
 
註釋:
返回句柄不是全局的或可繼承的。它不能被其它進程複製或使用。  假如lpModuleName沒有包含路徑,而且有多個相同的文件名和擴展名,將不能預測返回哪一個模塊的句柄。要解決這個問題,需要指定路徑。用side-by-side assemblies指定,或用GetModuleHandleEx來指定一個內存區而不是一個DLL名。  GetModuleHandle函數對一個映像的模塊返回一個句柄,而不會增加引用(reference)數。然而,在傳遞這個句柄給FreeLibrary函數時,要當心,因爲,這樣傳遞會導致一個DLL模塊過早地不能被映像。  這個函數在多線程程序中必須謹慎使用。不能保證這個模塊句柄在函數返回時和使用時是有效的。比如,一個線程得到模塊句柄,但在使用這個句柄之前,第二個線程釋放了這個模塊。假如這個系統載入另一個模塊,它可以再次使用最近釋放了的句柄。然而,第一個線程擁有一個模塊的句柄,這個模塊不同於先前那個模塊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章