在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獲取,這兒就不用再一一細述,可是編碼中最經常使用的仍是本文所描述的這幾種方法。