GetModuleHandle,AfxGetInstanceHandle使用区别
生活随笔
收集整理的這篇文章主要介紹了
GetModuleHandle,AfxGetInstanceHandle使用区别
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
GetModuleHandle,AfxGetInstanceHandle使用區(qū)別
當(dāng)一個(gè)文件被映射到調(diào)用進(jìn)程的地址空間時(shí),GetModuleHandle函數(shù)得到其中某一模塊的句柄?! ?br /> 使用GetModuleHandle函數(shù)格式:
HMODULE GetModuleHandle( LPCTSTR lpModuleName);
參數(shù) lpModuleName:
[in]用指針指向一個(gè)包含模塊名以NULL字符結(jié)尾的串,模塊是.dll或.exe文件。如果文件擴(kuò)展名省略,則增加默認(rèn)的擴(kuò)展名.dll。文件名串可以是省略號(hào)(...),表示模塊名沒(méi)有擴(kuò)展名。這個(gè)串不是必須指定一個(gè)路徑。當(dāng)指定一個(gè)路徑時(shí),確定要用反斜線(\),而不是斜線(/)。這個(gè)模塊名將和當(dāng)前映射到調(diào)用進(jìn)程地址空間的模塊名進(jìn)行獨(dú)立地比較?! 〖偃邕@個(gè)參數(shù)是NULL,函數(shù)將返回創(chuàng)建調(diào)用進(jìn)程(.exe文件)的文件的句柄?!?br />
返回值:
如果函數(shù)調(diào)用成功,返回值是某一模塊的句柄。 如果函數(shù)調(diào)用失敗,返回NULL。要得知更多的出錯(cuò)信息,調(diào)用GetLastError?!?br />
注釋:
返回句柄不是全局的或可繼承的。它不能被其它進(jìn)程復(fù)制或使用?! 〖偃鏻pModuleName沒(méi)有包含路徑,而且有多個(gè)相同的文件名和擴(kuò)展名,將不能預(yù)測(cè)返回哪一個(gè)模塊的句柄。要解決這個(gè)問(wèn)題,需要指定路徑。用side-by-side assemblies指定,或用GetModuleHandleEx來(lái)指定一個(gè)內(nèi)存區(qū)而不是一個(gè)DLL名?! etModuleHandle函數(shù)對(duì)一個(gè)映像的模塊返回一個(gè)句柄,而不會(huì)增加引用(reference)數(shù)。然而,在傳遞這個(gè)句柄給FreeLibrary函數(shù)時(shí),要當(dāng)心,因?yàn)?#xff0c;這樣傳遞會(huì)導(dǎo)致一個(gè)DLL模塊過(guò)早地不能被映像?! ∵@個(gè)函數(shù)在多線程程序中必須謹(jǐn)慎使用。不能保證這個(gè)模塊句柄在函數(shù)返回時(shí)和使用時(shí)是有效的。比如,一個(gè)線程得到模塊句柄,但在使用這個(gè)句柄之前,第二個(gè)線程釋放了這個(gè)模塊。假如這個(gè)系統(tǒng)載入另一個(gè)模塊,它可以再次使用最近釋放了的句柄。然而,第一個(gè)線程擁有一個(gè)模塊的句柄,這個(gè)模塊不同于先前那個(gè)模塊。 GetModuleHandle和AfxGetInstanceHandle和CWinApp->m_hInstance的區(qū)別 在工作中遇到一個(gè)問(wèn)題,就是在一個(gè)DLL中想改變這個(gè)DLL的窗口的ICON,于是寫了如下的代碼:
??? HICON??? hicon=LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_ICON1));
? if (hicon!=NULL)
? {
????? LRESULT? result=SendMessage(m_hWnd,WM_SETICON,ICON_SMALL,(LPARAM)hicon);??
? } 結(jié)果發(fā)現(xiàn)沒(méi)有成功,hicon=NULL,調(diào)試發(fā)現(xiàn)是LastError=1813,說(shuō)是找不到指定的資源。 后面換成了這樣的代碼就可以了:
???????? 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)絡(luò),了解到是由于DLL的句柄跟Application的句柄混淆不清的原因,這里需要的是DLL的句柄。 1.GetModuleHandle(LPCTSTR lpModuleName)
? 如果參數(shù)為空,那么獲取的就是調(diào)用這個(gè)DLL 的exe的 句柄,也即application句柄,而不是DLL的句柄 ? 如果要獲得當(dāng)前DLL的句柄,要傳入DLL的名稱即可。 2.AfxGetInstanceHandle()
?
?? 返回的是一個(gè)application的句柄,但是如果這個(gè)函數(shù)是從一個(gè)MFC的USRDLL版本DLL的內(nèi)部被調(diào)用,那么返回的就是這個(gè)DLL的句柄 3.CWinApp->m_hInstance
?
? 因?yàn)樗菑?AfxGetInstanceHandle()返回來(lái)獲得的,所以跟AfxGetInstanceHandle()的返回值一樣。
HMODULE GetModuleHandle( LPCTSTR lpModuleName);
參數(shù) lpModuleName:
[in]用指針指向一個(gè)包含模塊名以NULL字符結(jié)尾的串,模塊是.dll或.exe文件。如果文件擴(kuò)展名省略,則增加默認(rèn)的擴(kuò)展名.dll。文件名串可以是省略號(hào)(...),表示模塊名沒(méi)有擴(kuò)展名。這個(gè)串不是必須指定一個(gè)路徑。當(dāng)指定一個(gè)路徑時(shí),確定要用反斜線(\),而不是斜線(/)。這個(gè)模塊名將和當(dāng)前映射到調(diào)用進(jìn)程地址空間的模塊名進(jìn)行獨(dú)立地比較?! 〖偃邕@個(gè)參數(shù)是NULL,函數(shù)將返回創(chuàng)建調(diào)用進(jìn)程(.exe文件)的文件的句柄?!?br />
返回值:
如果函數(shù)調(diào)用成功,返回值是某一模塊的句柄。 如果函數(shù)調(diào)用失敗,返回NULL。要得知更多的出錯(cuò)信息,調(diào)用GetLastError?!?br />
注釋:
返回句柄不是全局的或可繼承的。它不能被其它進(jìn)程復(fù)制或使用?! 〖偃鏻pModuleName沒(méi)有包含路徑,而且有多個(gè)相同的文件名和擴(kuò)展名,將不能預(yù)測(cè)返回哪一個(gè)模塊的句柄。要解決這個(gè)問(wèn)題,需要指定路徑。用side-by-side assemblies指定,或用GetModuleHandleEx來(lái)指定一個(gè)內(nèi)存區(qū)而不是一個(gè)DLL名?! etModuleHandle函數(shù)對(duì)一個(gè)映像的模塊返回一個(gè)句柄,而不會(huì)增加引用(reference)數(shù)。然而,在傳遞這個(gè)句柄給FreeLibrary函數(shù)時(shí),要當(dāng)心,因?yàn)?#xff0c;這樣傳遞會(huì)導(dǎo)致一個(gè)DLL模塊過(guò)早地不能被映像?! ∵@個(gè)函數(shù)在多線程程序中必須謹(jǐn)慎使用。不能保證這個(gè)模塊句柄在函數(shù)返回時(shí)和使用時(shí)是有效的。比如,一個(gè)線程得到模塊句柄,但在使用這個(gè)句柄之前,第二個(gè)線程釋放了這個(gè)模塊。假如這個(gè)系統(tǒng)載入另一個(gè)模塊,它可以再次使用最近釋放了的句柄。然而,第一個(gè)線程擁有一個(gè)模塊的句柄,這個(gè)模塊不同于先前那個(gè)模塊。 GetModuleHandle和AfxGetInstanceHandle和CWinApp->m_hInstance的區(qū)別 在工作中遇到一個(gè)問(wèn)題,就是在一個(gè)DLL中想改變這個(gè)DLL的窗口的ICON,于是寫了如下的代碼:
??? HICON??? hicon=LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_ICON1));
? if (hicon!=NULL)
? {
????? LRESULT? result=SendMessage(m_hWnd,WM_SETICON,ICON_SMALL,(LPARAM)hicon);??
? } 結(jié)果發(fā)現(xiàn)沒(méi)有成功,hicon=NULL,調(diào)試發(fā)現(xiàn)是LastError=1813,說(shuō)是找不到指定的資源。 后面換成了這樣的代碼就可以了:
???????? 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)絡(luò),了解到是由于DLL的句柄跟Application的句柄混淆不清的原因,這里需要的是DLL的句柄。 1.GetModuleHandle(LPCTSTR lpModuleName)
? 如果參數(shù)為空,那么獲取的就是調(diào)用這個(gè)DLL 的exe的 句柄,也即application句柄,而不是DLL的句柄 ? 如果要獲得當(dāng)前DLL的句柄,要傳入DLL的名稱即可。 2.AfxGetInstanceHandle()
?
?? 返回的是一個(gè)application的句柄,但是如果這個(gè)函數(shù)是從一個(gè)MFC的USRDLL版本DLL的內(nèi)部被調(diào)用,那么返回的就是這個(gè)DLL的句柄 3.CWinApp->m_hInstance
?
? 因?yàn)樗菑?AfxGetInstanceHandle()返回來(lái)獲得的,所以跟AfxGetInstanceHandle()的返回值一樣。
總結(jié)
以上是生活随笔為你收集整理的GetModuleHandle,AfxGetInstanceHandle使用区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 在 Mac 上为 Android 编译
- 下一篇: SqlServer安装出错解决办法