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模块过早地不能被映像。 这个函数在多线程程序中必须谨慎使用。不能保证这个模块句柄在函数返回时和使用时是有效的。比如,一个线程得到模块句柄,但在使用这个句柄之前,第二个线程释放了这个模块。假如这个系统载入另一个模块,它可以再次使用最近释放了的句柄。然而,第一个线程拥有一个模块的句柄,这个模块不同于先前那个模块。