现在有一个进程A在运行,在我的程序中如何知道进程A被加载入内存的基地址(是0X400000还是0X10000)?用什么API?
解决方案 »
- MFC写的ActiveX Web控件能否接收Web客户端的JSon对象做调用接口的参数?
- DirectX如何调用显卡,实现tereo显示?
- 想进入软件行业的困惑者
- 小女子求助:我要用vc做一个swf格式的电子相册,有翻书效果的那种,该怎么做呢?
- 哪里有visual studio 2003 中文企业版 下载 网上好多都是不能下的链接
- 我想作一个DLL,这个DLL需要调用一个OCX控件,请问可以实现吗?
- 变量的问题???
- 使用classwizard添加新类出现的问题,搞不懂
- 添加工程?在线等待!
- 怎样修改网卡物理地址?
- 外地老百姓在京的315投诉
- 关于Installshield 打包包含数据库文件程序的问题
还有一种方法就是MODULEINFO modinfo={NULL};
HWND hwnd=0;
DWORD procId=0;
HANDLE hProc=0;
DWORD ImageBase=0;
hwnd = ::FindWindow("SciCalc","计算器");
::GetWindowThreadProcessId(hwnd,&procId);
hProc=::OpenProcess(PROCESS_ALL_ACCESS,false,procId);
::GetModuleInformation(hProc,NULL,&modinfo,sizeof(modinfo));
//应用程序一般是0x00400000,计算器在我的电脑为0x01000000 入口地址为0x010xxxxx 和0xFFF00000做与运算 保留前3个值结果为0x01000000 此方法还是很管用的。
//有些程序imagebase小于0xFFF00000的那会计算错误。不过这种情况很少见。我还没有碰见过。
ImageBase = (DWORD)modinfo.EntryPoint & 0xFFF00000;
#include<psapi.h>
#pragma comment(lib,"psapi.lib")
比如0x01000000是imagebase入口地址是偏移0x00512345 那么映射入口地址为0x01512345 用这个计算结果会错误。变成0x01500000
调用GetModuleInformation
通过第三参数获取模块信息
如果要读取其他进程的dll的基址,可获取进程的句柄,通过GetModuleInformation获得。