GetThreadContext返回错误6,无效句柄?

时间:2011-09-20 06:04:16

标签: c++ winapi getlasterror

#include <iostream>
#include <Windows.h>

using std::cout;
using std::endl;
using std::cin;

int main()
{
    cout << "1." << GetLastError() << endl;
    PROCESS_INFORMATION processInfo;
    STARTUPINFOA startupInfo = {0};
    CONTEXT context;

    context.ContextFlags = CONTEXT_FULL;

    cout << "3." << GetLastError() << endl;

    if (CreateProcess((PCHAR)"rsclient.exe", NULL, NULL, NULL, false, CREATE_SUSPENDED, NULL, NULL, &startupInfo, &processInfo) == false) {
        cout << "CreateProcess error: " << GetLastError() << endl;
    }

    cout << "4." << GetLastError() << endl;

    if (GetThreadContext(processInfo.hProcess, &context) == false) {
        cout << "GetThreadContext error:" << GetLastError() << endl;
    }

    return 0;
}

输出:

1.2
3.2
4.1813
GetThreadContext error:6

我可以在任务管理器中看到挂起的进程但是我收到了无效的句柄错误?

为什么GetLastError()会在程序开头提供ERROR_FILE_NOT_FOUND?

2 个答案:

答案 0 :(得分:2)

您应该使用processInfo.hThread,因为它是新进程主线程的句柄。 processInfo.hProcess是一个进程句柄,而不是一个线程句柄。

至于GetLastError()返回ERROR_FILE_NOT_FOUND,可能是其他人称为调用SetLastError(ERROR_FILE_NOT_FOUND)的API。来自GetLastError()的文档:

  

返回值

     

返回值是调用线程的最后错误代码。

     

每个函数的文档的返回值部分   设置最后一个错误代码注意函数的条件   设置最后一个错误代码。大多数设置线程的函数   最后错误代码在失败时设置它。但是,一些功能也   成功时设置最后一个错误代码。如果功能不是   记录以设置最后一个错误代码,由此返回的值   function只是最近设置的最后一个错误代码;   某些函数在成功时将最后错误代码设置为0,而其他函数则设置为0   不

答案 1 :(得分:-1)

当您使用进程ID作为输入调用GetThreadContext时,Windows无法找到任何此类线程,因此返回ERROR_FILE_NOT_FOUND。更好地给出新创建过程的主线程,您将获得所需的结果。