如何取得当前进程的实例句柄(不是伪句柄)

nbczhouyi 2004-12-14 09:46:53
例如我在后台运行一个程序,现在又打开了另一个程序P,那么我怎么能获得P进程的实例句柄呢?
GetCurrentProcess()好像不对,在vc++的WinMain里面有一个参数HINSTANCE hInstance,
这就表示的是当前实例的句柄,我用hInstance和GetCurrentProcess()在同一个函数
PIMAGE_IMPORT_DESCRIPTOR pImportDesc =
(PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData(Instance,
//GetCurrentProcess(),
TRUE,
IMAGE_DIRECTORY_ENTRY_IMPORT,
&size);
结果用GetCurrentProcess(),运行时错误为unhandle exception in....
而Instance却能得到正确的结果。
所以我认为用GetCurrentProcess()得到当前程序实例句柄是不对的。
这两个是由区别的。
...全文
944 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
nbczhouyi 2004-12-14
  • 打赏
  • 举报
回复
那还是要另一个进程的句柄的阿,
我做了一个全局的鼠标钩子(调试是成功的),当我启动本程序后,当鼠标点击其他进程的窗体后,鼠标钩子的回调函数就被调用咯,我想在回调函数里获得被点击窗体进程的实例句柄.
tabris17 2004-12-14
  • 打赏
  • 举报
回复
ReadProcessMemory

读取另一个进程的虚拟内存
nbczhouyi 2004-12-14
  • 打赏
  • 举报
回复
那么在一个程序里能得到另一个进程的PE文件信息么?
tabris17 2004-12-14
  • 打赏
  • 举报
回复
每个进程的虚拟内存是独立的

每个进程单独享有4GB的虚拟内存空间

>ImageBase好像是PE文件的优先装载地址,也并不一定是虚拟内存中该进程的基地址
你说的那是些三流教程上的东西,教条化了,EXE加载的ImageBase和PE文件中的定义值在99.9999999999999999999999999%是一致的
nbczhouyi 2004-12-14
  • 打赏
  • 举报
回复
ImageBase好像是PE文件的优先装载地址,也并不一定是虚拟内存中该进程的基地址
nbczhouyi 2004-12-14
  • 打赏
  • 举报
回复
原来是这样啊,内存中同时驻留了许多进程,他们的基地址因该是不一样的,那么在全局HOOK的DLL中,我要得到当前正运行的进程的可执行文件的基地址要怎么办啊?
tabris17 2004-12-14
  • 打赏
  • 举报
回复
hInstance是当前进程的可执行文件(EXE文件)在该进程的虚拟内存中的基地址(ImageBase),这个值在PE文件中是被指定,一般为0x00400000,他并不是一个句柄,只有在16位的windows程序中它才是一个句柄


而hProcess是当前进程的句柄,他和hInstane是个完完全全不相关的概念
tmpuser 2004-12-14
  • 打赏
  • 举报
回复
好像用HMODULE h = GetModuleHandle(NULL);可以取得执行这个方法的进程的句柄
tabris17 2004-12-14
  • 打赏
  • 举报
回复
HMODULE hProcInstance=GetModuleHandle("abc.dll");仅能获得当前进程中的模块

HANDLE hProcess=OpenProcess(...);
nbczhouyi 2004-12-14
  • 打赏
  • 举报
回复
tabris17(四不象)大哥:
帮我看看
DWORD hProcId;
HWND hCurrWnd=NULL;
HMODULE hProcInstance=NULL;
hCurrWnd = WindowFromPoint(mPoint);
GetWindowThreadProcessId(hCurrWnd,&hProcId);
hProcInstance = (HMODULE)OpenProcess(PROCESS_ALL_ACCESS ,FALSE, hProcId);
这样的代码对不?,定义的变量能得到一些数值,将变量的+号点开来为
unused:CXX30:expression cannot be evaluated. //表达式不能被求值
但进程的ID号却是正确的(我用win2000任务管理器看过),这是怎么回事啊?
是不是没有真正的得到句柄阿?
tabris17 2004-12-14
  • 打赏
  • 举报
回复
GetWindowThreadProcessId

得到进程ID,再用OpenProcess

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧