Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GetThreadContext返回错误6,句柄无效?_C++_Winapi_Getlasterror - Fatal编程技术网

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

C++ GetThreadContext返回错误6,句柄无效?,c++,winapi,getlasterror,C++,Winapi,Getlasterror,我可以在任务管理器中看到挂起的进程,但我得到了无效的句柄错误 另外,为什么GetLastError()会给出程序开始时未找到的错误文件?您应该使用processInfo.hThread,因为它是新进程主线程的句柄processInfo.hProcess是进程句柄,而不是线程句柄 至于GetLastError()返回ERROR\u-NOT\u-FOUND,可能是其他人调用了一个名为SetLastError(ERROR\u-NOT\u-FOUND)的API。根据以下文件: 返回值 返回值是调用线程的

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


另外,为什么GetLastError()会给出程序开始时未找到的错误文件?

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

至于
GetLastError()
返回
ERROR\u-NOT\u-FOUND
,可能是其他人调用了一个名为
SetLastError(ERROR\u-NOT\u-FOUND)
的API。根据以下文件:

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

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


当您以进程id作为输入调用GetThreadContext时,Windows无法找到任何此类线程,因此返回错误\u FILE\u not\u FOUND。最好给出新创建的进程的主线程,这样就可以得到所需的结果。

只有在从Windows函数获得失败返回代码时才使用GetLastError()。GetThreadState()需要一个线程句柄,而不是进程句柄。@HansPassant:类型安全现在看起来像是一种享受,是吗?
#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