【问题标题】:How to Compare Two variable of HANDLE type如何比较 HANDLE 类型的两个变量
【发布时间】:2010-08-17 07:52:22
【问题描述】:

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

【问题讨论】:

    标签: c++ winapi process handle


    【解决方案1】:

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

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

    【讨论】:

    • DuplicateHandle 的语法如下。 BOOL WINAPI DuplicateHandle(__in HANDLE hSourceProcessHandle,__in HANDLE hSourceHandle,__in HANDLE hTargetProcessHandle,__out LPHANDLE lpTargetHandle,__in DWORD dwDesiredAccess,__in BOOL bInheritHandle,__in DWORD dwOptions); dwOptions 可以获得以下两个值之一(DUPLICATE_CLOSE_SOURCE 或 DUPLICATE_SAME_ACCESS)或这些值的任意组合。现在我可以使用 PROCESS_QUERY_INFORMATION 标记加入这些值。
    • 将 dwOptions 设置为 0,并将 dwDesiredAccess 设置为所需的访问权限(例如 PROCESS_QUERY_INFORMATION 和您需要的任何其他内容)。
    【解决方案2】:

    hProcess 不能持有将要关闭的 Process 的 ProcessHandle。它可以而且大多数时候都会为 NULL。我正在做类似的事情来获取终止进程的 PID。
    if((hProcess == NULL) || (hProcess == GetCurrentProcess())){
    pid = GetCurrentProcessId();
    } else {
    pid = ProcessHandleToId(hProcess); }

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-11
        • 1970-01-01
        • 1970-01-01
        • 2018-03-20
        • 1970-01-01
        相关资源
        最近更新 更多