在DLL和EXE獲取進程HINSTANCE


  在VC編程中,當我們在操作資源中的聲音、圖片等一些資源時,都要用到進程的HINSANCE。不過在DLL中經常我們獲取的HINSANCE不為空,但是使用的時候卻獲取不到資源,本文討論的就是HINSTANCE獲取的問題。
  在MFC的exe程序中通常AfxGetInstanceHandle()就可以獲取應用程序的實例句柄,非常簡單,也可以使用GetModuleHandle()直接獲取。這個就不細說了。下面主要講一下在DLL中如何獲取當前HINSTANCE。
  考慮在DLL中以下兩句代碼:
HINSTANCE hInst = GetModuleHandle();
hsrc = FindResource( hInst , MAKEINTRESOURCE(dwRID), (LPCTSTR)"wav ");
DWORD dwError = GetLastError();
我們會發現dwError返回1813錯誤,也就是取不到資源,但是GetModuleHandle 函數執行成功了,hInst也並不為空。為什么呢?仔細研究GetModuleHandle()函數發現,其實它還能帶參數,我們將第一句改成:
HINSTANCE hInst = GetModuleHandle( “dll路徑“);
這時候就不會出錯了。原來在DLL中獲取HINSTANCE,需要將DLL路徑作為參數傳進去。直接使GetModuleHandle()獲取的是當前DLL所在exe程序的HINSTANCE。問題到這兒就解決了。可是如果我們並不知道DLL路徑呢?如我們軟件給用戶使用的時候,每個用戶可以選在不同的安裝路徑,我們用這個方法就沒辦法獲取DLL進程實例句柄了。那么有沒有其他方法可以獲取呢?DLL在運行的時候, 內存中一定有它的相關信息, 我們能直接從內存中來獲取其HINSTANCE不?事實上是可以的,下面為獲取DLL的HINSTANCE函數:
////獲取dll模塊句柄
HMODULE GetCurrentModule()
{
#if _MSC_VER < 1300    // earlier than .NET compiler (VC 6.0)
// Here's a trick that will get you the handle of the module
// you're running in without any a-priori knowledge:
MEMORY_BASIC_INFORMATION mbi;
static int dummy;
VirtualQuery( &dummy, &mbi, sizeof(mbi) );

return reinterpret_cast<HMODULE>(mbi.AllocationBase);
#else  
// from ATL 7.0 sources
return reinterpret_cast<HMODULE>(&__ImageBase);
#endif
}  
上面這個函數就可以直接返回當前DLL實例句柄,這個方法也就不需要考慮DLL路徑問題了。
獲取進程句柄實例並不止上述幾種方法,比如還可以根據進程名或者進程ID獲取,這兒就不用再一一細述,但是編碼中最常用的還是本文所描述的這幾種方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM