如果文件已被映射到调用进程的地址空间,GetModuleHandle函数将返回指定模块的模块句柄。
HMODULE的GetModuleHandle(
LPCTSTR 【lpModuleName】 | //返回句柄的模块名称的地址 |
); |
参数
【lpModuleName】
指向一个以空字符结尾的字符串,命名一个Win32模块(一个.DLL或.EXE文件)。如果省略了文件扩展名,则附加默认库扩展名.DLL。文件名字符串可以包括一个尾点字符(。),以指示模块名称没有扩展名。字符串不必指定路径。将名称与当前映射到调用进程的地址空间的模块的名称进行比较(独立于)。
如果此参数为NULL,则GetModuleHandle返回用于创建调用进程的文件句柄。
返回值
如果函数成功,则返回值是指定模块的句柄。
如果函数失败,返回值为NULL。要获取扩展错误信息,请调用GetLastError.
备注
返回的句柄不是全局的,可继承的或重复的,它不能被另一个进程使用。
GetModuleHandle和LoadLibrary返回的句柄可以在同一个函数__中使用,例如GetProcAddress,FreeLibrary或LoadResource.这两个功能之间的区别涉及引用计数。LoadLibrary如果需要,将模块映射到调用进程的地址空间,如果已经映射,则增加模块的引用计数。GetModuleHandle但是,返回映射模块的句柄,而不增加其引用计数。
请注意,FreeLibrary中使用引用计数来确定是否从进程的地址空间中取消映射功能。为此,在FreeLibrary的调用中使用GetModuleHandle返回的句柄时,请小心,因为这样做可能导致动态链接库(DLL)模块过早取消映射。
还必须在多线程应用程序中仔细使用此函数。不能保证模块句柄在该函数返回句柄的时间与另一个函数使用的时间之间保持有效。例如,线程可以通过调用GetModuleHandle.来检索模块句柄。在线程使用另一个函数中的句柄之前,第二个线程可以释放模块,并且系统可以加载另一个模块,给出与模块相同的句柄最近才释放。然后,第一个线程将留下一个模块句柄,该模块句柄指的是与预期的模块不同的模块。
也可以看看
FreeLibrary, GetModuleFileName, GetProcAddress, LoadLibrary, LoadResource