在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获取,这儿就不用再一一细述,可是编码中最经常使用的仍是本文所描述的这几种方法。
相关文章
相关标签/搜索