Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.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++ GetStdHandle()如何知道我的进程是什么?_C++_Winapi - Fatal编程技术网

C++ 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(

当我调用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。