C++ GetStdHandle()如何知道我的进程是什么?
当我调用GetStdHandle或对我的进程执行某些操作的其他函数时,例如:C++ GetStdHandle()如何知道我的进程是什么?,c++,winapi,C++,Winapi,当我调用GetStdHandle或对我的进程执行某些操作的其他函数时,例如: HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE); GetStdHandle将返回我的进程的STDOUT句柄,但是这个函数如何知道我的进程是什么,我的意思是我没有将进程id作为参数提供给它。好吧,让我们假设您需要传递进程id。您将如何做 DWORD my_id = GetCurrentProcessId(); HANDLE hStdOut = GetStdHandle(
HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
GetStdHandle将返回我的进程的STDOUT句柄,但是这个函数如何知道我的进程是什么,我的意思是我没有将进程id作为参数提供给它。好吧,让我们假设您需要传递进程id。您将如何做
DWORD my_id = GetCurrentProcessId();
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE, my_id);
显然,如果我们不止一次地调用它,我们可以通过将其放入助手函数中来节省一些重复工作:
HANDLE MyGetStdHandle(DWORD nStdHandle)
{
DWORD my_id = GetCurrentProcessId();
return GetStdHandle(STD_OUTPUT_HANDLE, my_id);
}
但是,很多人都需要这个功能。也许我们应该把它放进图书馆。。。或者一个API。。。事实上,我们只需将其添加到Windows API中,并将其称为GetStdHandle
他们做到了
好吧,它不是真的那样工作,但我认为它说明了这一点。Windows API必须知道您从哪个进程调用它,否则它将无法执行任何操作。每个进程都有一个与之关联的函数,基本上函数只是从PEB返回该值。STDIN句柄是调用进程的全局变量。函数只是返回当前值。该值是在进程启动时建立的,除非您的代码调用SetStdHandle来覆盖它。因为操作系统知道它当前正在运行的进程,并且它会运行。@JoachimPileborg:您链接到的文档中说:返回值是当前进程的伪句柄。伪句柄是一个特殊常量,目前处理-1。因此,它实际上并没有返回调用进程的真正句柄。只是一个假值,在需要时向低级API发出信号,以解析实际的进程句柄。。。。但是你可以。但是GetCurrentProcessId怎么知道我的进程是什么呢?也许这个函数应该在我的问题中。根据Jonathan的评论,实际实现可能使用PEB。但原则上它不需要这样做。Windows控制着CPU;在当前时间片开始时,它决定让CPU运行程序中的代码,并且根据Joachim的评论,它有一个该决定的记录。作为比较,类似于DOS,当应用程序运行时,操作系统不控制CPU,更简单的是:只有一个标准输出句柄,因为一次只能运行一个应用程序。这也意味着没有进程ID。