Windows句柄始终返回INVALID_HANDLE_VALUE

arc*_*arc -4 c++ winapi

HANDLE process = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, PID);
    if (process = INVALID_HANDLE_VALUE)
    {
        printf("Failed to open PID %d, error code %d",
            PID, GetLastError());
    }
Run Code Online (Sandbox Code Playgroud)

我试过这个功能,但总是返回"无法打开PID(编号)错误代码0".即使只有PROCESS_VM_READ.

当我输出此代码中的内存地址的值

ReadProcessMemory(process, (LPVOID)0x14AC1BC, &value, sizeof(DWORD), NULL);
cout << value << endl;
Run Code Online (Sandbox Code Playgroud)

它返回垃圾值.

joh*_*ohn 7

OpenProcess NULL失败时返回INVALID_HANDLE_VALUE.您也=应该在使用时使用==.代码应该是

HANDLE process = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, PID);
if (process == NULL)
{
}
Run Code Online (Sandbox Code Playgroud)


use*_*670 5

process = INVALID_HANDLE_VALUE执行覆盖进程句柄值的赋值,而不是比较。另外如果出现错误OpenProcess也会返回NULL。像这样重写检查:

if(NULL == process)
Run Code Online (Sandbox Code Playgroud)


Dav*_*nan 5

您错误地为该process变量分配了两次。打电话时一次OpenProcess,写信时再一次

if (process = INVALID_HANDLE_VALUE)
Run Code Online (Sandbox Code Playgroud)

这分配INVALID_HANDLE_VALUEprocess测试是否process为非零。情况总是如此,因为INVALID_HANDLE_VALUE是非零的。你犯了一个典型的错误,=当你想使用 时却使用了==。因此,您完全忽略了返回的值OpenProcess

请注意,OpenProcess通过返回 来指示失败NULL。所以你的代码应该是

if (process == NULL) 
Run Code Online (Sandbox Code Playgroud)