首页
社区
课程
招聘
[求助]请教高手一个奇怪问题!
发表于: 2008-11-30 03:14 4322

[求助]请教高手一个奇怪问题!

2008-11-30 03:14
4322
我在用C++编程的时候,在使用OPENPROCESS这函数的时候。无论传入什么样的PID,最后返回出来的句柄居然都是80。既不是0也不是NULL。非常奇怪,一个固定的数值,无论怎么改PID结果还是一样。枚举窗口时出现的问题,当枚举到指定窗口时,句柄和PID值都正常。就是hProcess是固定数值,无论枚举到的窗口是什么,他的数值都是80.穷尽头脑也想不到原因,请教各位高手

#include<windows.h>
BOOL __stdcall AProc(HWND,LPARAM);
HANDLE hProcess;
HWND hEnum;
DWORD EnumPID;
int __stdcall WinMain(HINSTANCE hInstance,HINSTANCE,LPSTR,int)
{   
   ::EnumWindows(AProc,0);                     
    return 0;       
}
BOOL __stdcall AProc(HWND hwnd,LPARAM lParam)   
{
    char CWtext[256];
    char *pzx="中文";
    int len=::GetWindowText(hwnd,CWtext,256);
         if(strstr(CWtext,pzx))
        {
        HWND hEnum=hwnd;                          
        ::GetWindowThreadProcessId(hEnum,&EnumPID);
        HANDLE hProcess=::OpenProcess(PROCESS_ALL_ACCESS,FALSE,EnumPID);
        ::CloseHandle(hProcess);
        }
         return true;
}

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 191
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
没有人愿意告诉我么? 郁闷中~
2008-12-3 19:46
0
雪    币: 3
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我想应该是这样:

      当一个进程被创建的时候,该进程的句柄表同时被创建(注意,是句柄表); 这个句柄表,就是记录了该进程可访问可使用的内核对象的句柄,但进程在使用这些内核对象的时候,并不直接使用这些对象的句柄,而是使用‘索引’;

    就是说,当你获得一个新的对象的句柄的时候, 句柄表里就会增加一项,是按序列增加的,好像1, 2, 3, 4.... 这样, 这个句柄表里使用的‘索引’,就是你进程中使用的所谓的‘句柄’;

    那么不难解释你上面的那个程序, 你OpenProcess后, 程序立即在句柄表里增加了一个‘索引’, 80(可能是因为之前句柄表里的最高索引为79),接着你CloseHandle,对象对于你的进程来说,被释放了,这个值为‘80’的索引从你的句柄表里被删除;   然后,又OpenProcess获得一个句柄,当然,又是‘80’, 你又CloseHanlde,这个‘80’又没了.... 如此循环, 所以, 这个值一直都是: 80
2008-12-4 01:46
0
雪    币: 191
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢你的解答,为了证实你的说法,我在代码::CloseHandle(hProcess);
前面加了一排::TerminateProcess(hProcess,0);来验证我获得的句柄是否正确。

结果吓我一条,桌面explorer.EXE进程重新启动了,我所有的文件夹都被关闭了,但桌面的应用程序,QQ都还在,就文件夹关闭了,桌面重启了。

请指教?为什么那个句柄为指向桌面句柄而不是我获得的应用程序句柄
2008-12-5 18:14
0
雪    币: 3
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
自己根据实际情况慢慢调试, 我哪知你那个有"中文"这两个字的窗口是什么? 可能这个窗口就是Explorer创建的
2008-12-5 23:00
0
游客
登录 | 注册 方可回帖
返回
//