Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.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++ 如何比较句柄类型的两个变量_C++_Winapi_Process_Handle - Fatal编程技术网

C++ 如何比较句柄类型的两个变量

C++ 如何比较句柄类型的两个变量,c++,winapi,process,handle,C++,Winapi,Process,Handle,我有一个句柄类型的变量。 第一个句柄变量是一个进程句柄(名为hProcess),它没有进程\查询\信息访问权限。 第二个变量也是一个进程句柄(名为hwndProcess),我通过OpenProcess函数打开了它,并拥有进程\查询\信息访问权。我相信这两个过程应该有相同的处理。 但当我将它们进行如下比较时,它返回false; 如果(hProcess==hwndProcess){do something} 我该怎么做?没有明确的方法来检查两个句柄是否引用同一个进程。唯一的方法是查询流程信息并进行检

我有一个句柄类型的变量。 第一个句柄变量是一个进程句柄(名为hProcess),它没有进程\查询\信息访问权限。 第二个变量也是一个进程句柄(名为hwndProcess),我通过OpenProcess函数打开了它,并拥有进程\查询\信息访问权。我相信这两个过程应该有相同的处理。 但当我将它们进行如下比较时,它返回false; 如果(hProcess==hwndProcess){do something}
我该怎么做?

没有明确的方法来检查两个句柄是否引用同一个进程。唯一的方法是查询流程信息并进行检查,例如在每个句柄上使用
GetProcessId
来检查流程ID


如果您没有必要的访问权限来调用所需的查询函数,则可以尝试调用
DuplicateHandle
,以获得具有更多访问权限的新句柄。但是,如果此操作失败,则无法判断句柄是否属于同一进程。

hProcess不能保留将关闭的进程的ProcessHandle。它可以并且将在大多数情况下为空。我正在做类似的事情来获取终止进程的PID。
if((hProcess==NULL)| |(hProcess==GetCurrentProcess()){
pid=GetCurrentProcessId();
}否则{
pid=ProcessHandleToId(hProcess); }


您确定这是访问权限问题,并且您的函数没有失败,因为句柄为NULL吗?

Windows 10 SDK具有CompareObject句柄(句柄,句柄),如果句柄引用相同的底层内核对象,则返回TRUE。
您不必担心访问权限。

下面是DuplicateHandle的语法。BOOL WINAPI DuplicateHandle(u在句柄hSourceProcessHandle中,u在句柄hSourceHandle中,u在句柄hTargetProcessHandle中,u在LPHANDLE lpTargetHandle中,u在DWORD dwDesiredAccess中,u在BOOL bInheritHandle中,u在DWORD DWORD选项中);dwOptions可以获取以下两个值中的一个(复制\u关闭\u源或复制\u相同\u访问)或这些值的任意组合。现在,我可以将这些值与PROCESS\u QUERY\u信息标记连接起来。将dwOptions设置为0,并将dwDesiredAccess设置为所需的访问权限(例如PROCESS\u QUERY\u信息和您需要的任何其他内容)。