这个答案来自
Hans Passant
:
问题主要是由于使用
FILE_FLAG_OPEN_REPARSE_POINT
执行以下操作的标志:
OpenFileById函数将打开文件或重新分析
点,具体取决于FILE\u FLAG\u OPEN\u REPARSE\u点标志的使用。
[source]
。
以下是最终代码(上面的注释中有多个修复):
std::wstring GetSymbolicLinkTarget(std::wstring const& linkPath)
{
TCHAR path[MAX_PATH];
CAutoFile hFile = CreateFile( linkPath.c_str(),
0,
0,
0,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,
0);
if (INVALID_HANDLE_VALUE != hFile)
{
auto rcode = GetFinalPathNameByHandle(hFile, path, MAX_PATH, FILE_NAME_NORMALIZED);
if (rcode)
{
if (path[0] == '\\' && path[1] == '\\' && path[2] == '?' && path[3] == '\\')
return std::wstring(path + 4, path + rcode);
else
return std::wstring(path, path + rcode);
}
}
return std::wstring();
}