坚持使用OpenProcess,总是返回0

时间:2012-12-10 06:30:02

标签: c++ winapi openprocess

当我运行程序时会发生奇怪的事情。当我使用" Start Without Debugging"在VS 2010中的选项,OpenProcess像往常一样返回进程句柄,但是当我在Windows资源管理器中运行我的程序时,OpenProcess总是返回0?!!我调用了GetLastError,它在两种情况下都返回6(INVALID_HANDLE_VALUE)。我使用的是Windows XP SP3 请问有人帮帮我吗?这是我写的代码:

HANDLE GetProcessHandle(TCHAR* szProcessName)
{
    //Get the snapshot of all processes in the system
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
    if (hSnap == INVALID_HANDLE_VALUE)
    {
        return INVALID_HANDLE_VALUE;
    }

    PROCESSENTRY32 pe32;
    pe32.dwSize = sizeof(PROCESSENTRY32);

    //Get the information of the first process
    if (!Process32First(hSnap, &pe32))
    {
        CloseHandle(hSnap);
        return INVALID_HANDLE_VALUE;
    }

    //Loop through all processes
    do
    {
        if (_tcscmp(szProcessName, pe32.szExeFile) == 0)
        {
            //Got the process ID
            CloseHandle(hSnap);
            printf("sz = %s; exe = %s; pid = %d\n", szProcessName, pe32.szExeFile, pe32.th32ProcessID);
                            //Error here, correct PID was found in both case
            return OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
        }
    } 
    while (Process32Next(hSnap, &pe32));

    CloseHandle(hSnap);
    return INVALID_HANDLE_VALUE;
}

1 个答案:

答案 0 :(得分:2)

要打开另一个本地进程的句柄并获取完全访问权限,必须启用SeDebugPrivilege权限。

VS2010有这个特权,但探索没有。由于您的程序是子进程,因此它将继承父进程的权限。

有关详细信息,请查看此MSDN doc