如何确定两个Win32 API句柄代表同一个对象?

时间:2015-04-03 17:12:42

标签: c++ winapi handle

假设我有两个汉德:

HANDLE h1;
HANDLE h2;

两者都收到了一些Windows API函数产生的值 - 特别是,我对调用CreateFile()产生的句柄感兴趣。在h1的情况下,如何确定h2CreateFile()引用相同的基础对象 - 相同的文件,目录或设备?是否有一些API来确定?

3 个答案:

答案 0 :(得分:2)

GetFileInformationByHandle API返回可用于唯一标识引用对象的信息:

  

您可以比较BY_HANDLE_FILE_INFORMATION结构中返回的VolumeSerialNumber和FileIndex成员,以确定两条路径是否映射到同一目标;例如,您可以比较两个文件路径并确定它们是否映射到同一目录。

例如:

bool SameFile( HANDLE h1, HANDLE h2 ) {
    BY_HANDLE_FILE_INFORMATION bhfi1 = { 0 };
    BY_HANDLE_FILE_INFORMATION bhfi2 = { 0 };
    if ( ::GetFileInformationByHandle( h1, &bhfi1 ) &&
         ::GetFileInformationByHandle( h2, &bhfi2 ) ) {
        return ( ( bhfi1.nFileIndexHigh == bhfi2.nFileIndexHigh ) &&
                 ( bhfi1.nFileIndexLow  == bhfi2.nFileIndexLow ) &&
                 ( bhfi1.dwVolumeSerialNumber == bhfi2.dwVolumeSerialNumber ) );
    }
    return false;
}

答案 1 :(得分:2)

Windows 10的新功能:

CompareObjectHandles - 比较两个对象句柄,以确定它们是否引用相同的底层内核对象。

https://msdn.microsoft.com/en-us/library/windows/desktop/mt438733(v=vs.85).aspx

答案 2 :(得分:1)

您可以使用GetFinalPathNameByHandle并比较两个句柄的文件路径。 https://msdn.microsoft.com/en-us/library/windows/desktop/aa364962(v=vs.85).aspx