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