У меня есть проект, в котором я должен получить цель соединения. Вот некоторый код, который я придумал:
#include "stdafx.h"#include <iostream>
#include <Windows.h>
#define BUFSIZE MAX_PATH
using namespace std;int main()
{
TCHAR Path[BUFSIZE];
DWORD dwRet;
HANDLE hFile;
hFile = CreateFile(L"C:\\Users\\Test\\Documents\\My Videos",
GENERIC_READ,
FILE_SHARE_READ,
0,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT,
0);
if (hFile == INVALID_HANDLE_VALUE)
{
printf("Could not open file (error %d)\n", GetLastError());
return 0;
}
dwRet = GetFinalPathNameByHandle(hFile, Path, BUFSIZE, VOLUME_NAME_DOS);
if (dwRet < BUFSIZE)
{
_tprintf(TEXT("\nThe final path is: %s\n"), Path);
}CloseHandle(hFile);
//wcout << Path;
return 0;
}
Теперь, странная вещь в том, что код возвращает GetFinalPathNameByHandle
для каждого каталога за исключением точки соединения / повторной обработки Documents \ My Videos. Для соединений это выдает «ошибку 5» с GetLastError()
, Кто-нибудь знает, что может вызвать это?
Я докопался до этого. Сначала вы должны сделать takeown /f "C:\users\test\Documents\My Videos" /r /d y
прежде чем любой C ++ API сможет открыть дескриптор объекта файловой системы.
РЕДАКТИРОВАТЬ 2:
Для тех, кто читает это в будущем. Приведенный выше код может работать, но только когда вы используете takeown
командование на стыке. Перед takeown
использование есть Everyone:(DENY)(S,RD)
политика по стандартным соединениям Windows, которая запрещает всем пользователям доступ на чтение. После того, как политика исчезла, соединение также можно использовать в проводнике Windows.
РЕДАКТИРОВАТЬ: Это рабочее решение в C ++ без использования команды takeown:
#define BUFSIZE MAX_PATH
using namespace std;
int main()
{
TCHAR Path[BUFSIZE];
DWORD dwRet;
HANDLE hFile;
hFile = CreateFile(L"C:\\Users\\Test\\Documents\\My Music",
0,
0,
0,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,
0);
if (hFile == INVALID_HANDLE_VALUE)
{
printf("Could not open file (error %d)\n", GetLastError());
return 0;
}
dwRet = GetFinalPathNameByHandle(hFile, Path, BUFSIZE, VOLUME_NAME_DOS);
if (dwRet < BUFSIZE)
{
_tprintf(TEXT("\nThe final path is: %s\n"), Path);
}
CloseHandle(hFile);
return 0;
}
Продукт этого кода является целевым путем C:\users\test\Documents\My Music
Других решений пока нет …