GetModuleHandle()与GetModuleHandleEx()说明

GetModuleHandle()与GetModuleHandleEx()

这两个函数都是用于获取"已经映射到调用进程中"的模块的句柄。

1.GetModuleHandle(lpModuleName)
lpModuleName是模块的名称,可以是**.dll或者**.exe,如果没有扩展名,则默认为dll.
如果模块名称通过路径来指定,则路径中必须使用"\",而不是"/".
执行时,该函数通过名称(大小写不敏感)来查看调用进程已映射的模块,返回符合的模块句柄。

如果GetModuleHandle(NULL),则返回调用进程本身的句柄。

成功,则返回句柄,失败,返回NULL。错误信息:GetLastError()


ps:
GetModuleHandle函数不会增加所指定模块的引用数,也就是说,不管调用该函数几次,只要调用一次FreeLibrary函数,该模块就从进程中卸载了。
在多线程中,模块句柄在不同线程中不总是有效的。如:当在一个线程中调用了该函数获取了某一模块的句柄,但在使用该句柄之前,另一个线程把该句柄
Free了,并重新获取了其他模块的句柄。这个时候第一个线程再去使用这个句柄变量,就不再是之前它打算操作的那个模块了,而是第二个线程修改后的模块
句柄了。


2.GetModuleHandleEx(dwFlags, lpModuleName, phModule)
dwFlags:
如果是0,则当调用该函数时,模块的引用计数自动增加,调用者在使用完模块句柄后,必须调用一次FreeLibrary
如果是GET_MODULE_HANDLE_EX_FLAG_PIN,则模块一直映射在调用该函数的进程中,直到该进程结束,不管调用多少次FreeLibrary
如果是GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,则同GetModuleHandle相同,不增加引用计数
如果是GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,则lpModuleName是模块中的一个地址

phModule存储要找的句柄。其他都和GetModuleHandle函数相同

posted on 2012-06-29 14:01  ActiveChange  阅读(26334)  评论(0编辑  收藏  举报

导航