前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >进程模块句柄

进程模块句柄

作者头像
战神伽罗
发布2019-07-24 16:49:48
1.2K0
发布2019-07-24 16:49:48
举报

一、注意区别进程模块句柄和进程内核句柄

二、每个可执行文件或者DLL文件被装入到某个进程地址空间后,都会有一个唯一的实例句柄,来表示装入后的可执行文件或者DLL,此时我们把这个可执行文件或者DLL叫做进程地址空间中的一个模块。

进程模块句柄的本质就是当前模块的起始地址。

三、如何获取进程模块句柄

a.HMODULE GetModuleHandle( LPCTSTR lpModuleName)

1. 如果这个函数的参数是NULL的话,那么这个函数只返回当前进程的模块地址!!

2. 在DLL中,调用GetModuleHandle,返回的不是DLL模块的地址,而是当前进程的模块地址!

3. 这个函数只检查本进程地址空间,不检查别的进程的地址空间。

获得进程中模块对应的文件名

DWORD GetModuleFileName( HMODULE hInstance,//进程句柄 PTSTR pszPath,//文件名 DWORD cchPath);//pszPath指向的内存的大小

b.WinMain函数中的第一个参数hInstance

四、如果代码位于DLL文件中,那么想知道这个DLL文件被装入进程空间后的模块地址怎么办?

1.

extern “C” HANDLE __ImageBase; int main() { printf(“%x\n”,&__ImaggeBase); return 0; }

2.

void fun(HMODULE* hModule) { GetModuleHandleEx( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (PCTSTR)fun,&hModule); }

五、实例

#include <stdio.h> #include <tchar.h> #include <windows.h> #include <locale.h> extern "C" HANDLE __ImageBase; int _tmain(int argc, _TCHAR* argv[]) { _tsetlocale(LC_ALL,_T("chs")); //支持中文 _tprintf(L"__ImageBase:%4x \n",&__ImageBase); HMODULE hMoudle = GetModuleHandle(nullptr); _tprintf(L"当前进程模块句柄为:%4x \n",hMoudle); TCHAR fileName[MAX_PATH] = {0}; GetModuleFileName(hMoudle,fileName,MAX_PATH); _tprintf(L"当前进程模块文件名:%s \n",fileName); _gettchar(); return 0; }

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档