日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

GetModuleHandle,AfxGetInstanceHandle使用区别

發(fā)布時間:2024/4/11 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GetModuleHandle,AfxGetInstanceHandle使用区别 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
GetModuleHandle,AfxGetInstanceHandle使用區(qū)別 當一個文件被映射到調(diào)用進程的地址空間時,GetModuleHandle函數(shù)得到其中某一模塊的句柄。  
使用GetModuleHandle函數(shù)格式:
HMODULE GetModuleHandle( LPCTSTR lpModuleName);  
  
參數(shù)  lpModuleName:
    
[in]用指針指向一個包含模塊名以NULL字符結尾的串,模塊是.dll或.exe文件。如果文件擴展名省略,則增加默認的擴展名.dll。文件名串可以是省略號(...),表示模塊名沒有擴展名。這個串不是必須指定一個路徑。當指定一個路徑時,確定要用反斜線(\),而不是斜線(/)。這個模塊名將和當前映射到調(diào)用進程地址空間的模塊名進行獨立地比較。    假如這個參數(shù)是NULL,函數(shù)將返回創(chuàng)建調(diào)用進程(.exe文件)的文件的句柄。 
 
返回值:  
如果函數(shù)調(diào)用成功,返回值是某一模塊的句柄。  如果函數(shù)調(diào)用失敗,返回NULL。要得知更多的出錯信息,調(diào)用GetLastError。 
 
注釋:
返回句柄不是全局的或可繼承的。它不能被其它進程復制或使用。  假如lpModuleName沒有包含路徑,而且有多個相同的文件名和擴展名,將不能預測返回哪一個模塊的句柄。要解決這個問題,需要指定路徑。用side-by-side assemblies指定,或用GetModuleHandleEx來指定一個內(nèi)存區(qū)而不是一個DLL名。  GetModuleHandle函數(shù)對一個映像的模塊返回一個句柄,而不會增加引用(reference)數(shù)。然而,在傳遞這個句柄給FreeLibrary函數(shù)時,要當心,因為,這樣傳遞會導致一個DLL模塊過早地不能被映像。  這個函數(shù)在多線程程序中必須謹慎使用。不能保證這個模塊句柄在函數(shù)返回時和使用時是有效的。比如,一個線程得到模塊句柄,但在使用這個句柄之前,第二個線程釋放了這個模塊。假如這個系統(tǒng)載入另一個模塊,它可以再次使用最近釋放了的句柄。然而,第一個線程擁有一個模塊的句柄,這個模塊不同于先前那個模塊。 GetModuleHandle和AfxGetInstanceHandle和CWinApp->m_hInstance的區(qū)別 在工作中遇到一個問題,就是在一個DLL中想改變這個DLL的窗口的ICON,于是寫了如下的代碼:
??? HICON??? hicon=LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_ICON1));
? if (hicon!=NULL)
? {
????? LRESULT? result=SendMessage(m_hWnd,WM_SETICON,ICON_SMALL,(LPARAM)hicon);??
? } 結果發(fā)現(xiàn)沒有成功,hicon=NULL,調(diào)試發(fā)現(xiàn)是LastError=1813,說是找不到指定的資源。 后面換成了這樣的代碼就可以了:
???????? HICON??? hicon=LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON1));
? if (hicon!=NULL)
? {
????? LRESULT? result=SendMessage(m_hWnd,WM_SETICON,ICON_SMALL,(LPARAM)hicon);??
? } 換成下面這種也可以:
???????? HICON??? hicon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));
? if (hicon!=NULL)
? {
????? LRESULT? result=SendMessage(m_hWnd,WM_SETICON,ICON_SMALL,(LPARAM)hicon);??
? }
??????????????? 百思不得其解,后面查MSDN和網(wǎng)絡,了解到是由于DLL的句柄跟Application的句柄混淆不清的原因,這里需要的是DLL的句柄。 1.GetModuleHandle(LPCTSTR lpModuleName)

? 如果參數(shù)為空,那么獲取的就是調(diào)用這個DLL 的exe的 句柄,也即application句柄,而不是DLL的句柄 ? 如果要獲得當前DLL的句柄,要傳入DLL的名稱即可。 2.AfxGetInstanceHandle()
?
?? 返回的是一個application的句柄,但是如果這個函數(shù)是從一個MFC的USRDLL版本DLL的內(nèi)部被調(diào)用,那么返回的就是這個DLL的句柄 3.CWinApp->m_hInstance
?
? 因為它是從 AfxGetInstanceHandle()返回來獲得的,所以跟AfxGetInstanceHandle()的返回值一樣。

總結

以上是生活随笔為你收集整理的GetModuleHandle,AfxGetInstanceHandle使用区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。