现在的位置: 首页 > 综合 > 正文

GetModuleHandle函数

2018年06月06日 ⁄ 综合 ⁄ 共 856字 ⁄ 字号 评论关闭

VC声明:

       HMODULE GetModuleHandle (LPCTSTR lpModuleName); 
  功能说明 
  获取一个应用程序或动态链接库的模块句柄 
  参数说明 
  lpModuleName 模块名称 
  返回值 
  如执行成功成功,则返回模块句柄。零表示失败。通过GetLastError获得错误信息 
  如: 
       GetModuleHandle(NULL); //  这将返回自身应用程序句柄

            GetModuleHandle("kernel32");//这将返回kernel32.dll的句柄

模块句柄实际上就是模块在当前进程空间的装入地址。exe程序装入句柄一般为 0x00400000 。所以GetModuleHandle(NULL); 返回的值为  0x00400000;GetModuleHandle("kernel32");返回值是0x7c800000(这个值正是kernel32.dll中的Image base的值)。

注释:
返回句柄不是全局的或可继承的。它不能被其它进程复制或使用。  假如lpModuleName没有包含路径,而且有多个相同的文件名和扩展名,将不能预测返回哪一个模块的句柄。要解决这个问题,需要指定路径。用side-by-side assemblies指定,或用GetModuleHandleEx来指定一个内存区而不是一个DLL名。  GetModuleHandle函数对一个映像的模块返回一个句柄,而不会增加引用(reference)数。然而,在传递这个句柄给FreeLibrary函数时,要当心,因为,这样传递会导致一个DLL模块过早地不能被映像。  这个函数在多线程程序中必须谨慎使用。不能保证这个模块句柄在函数返回时和使用时是有效的。比如,一个线程得到模块句柄,但在使用这个句柄之前,第二个线程释放了这个模块。假如这个系统载入另一个模块,它可以再次使用最近释放了的句柄。然而,第一个线程拥有一个模块的句柄,这个模块不同于先前那个模块。

抱歉!评论已关闭.