ntdll(在win10 1607中)导出下一个API BOOLEAN NTAPI RtlAreLongPathsEnabled();
- 所以你可以调用它。它返回TRUE
如果LongPaths启用
这里代码尖晶石 - 如果RtlAreLongPathsEnabled
返回false - STATUS_NAME_TOO_LONG
(c0000106)返回
系统需要Win32的路径转换为NT路径之前,在任何文件中的函数使用它,哪个调用内核。这通过呼叫RtlDosPathNameTo*NtPathName*
完成。此功能,如果看到该路径超过MAX_PATH
(〜) - 称为RtlAreLongPathsEnabled()
并继续工作,只有当功能返回TRUE
。如果为false - STATUS_NAME_TOO_LONG
返回。
RtlAreLongPathsEnabled
的代码很简单 - 首次调用时 - 它检查注册表(并且仅注册表)并保存结果。根本没有寻找清单。这里的功能完全相同的代码:
BOOLEAN RtlAreLongPathsEnabled()
{
static BOOLEAN init;
static BOOLEAN elp;
if (!init)
{
init = true;
HANDLE hKey;
KEY_VALUE_PARTIAL_INFORMATION kvpi;
STATIC_OBJECT_ATTRIBUTES(FileSystemRegKeyName, "\\registry\\MACHINE\\SYSTEM\\CurrentControlSet\\Control\\FileSystem");
if (0 <= ZwOpenKey(&hKey, KEY_READ, &FileSystemRegKeyName))
{
STATIC_UNICODE_STRING(LongPathRegKeyValue, "LongPathsEnabled");
if (0 <= ZwQueryValueKey(hKey, &LongPathRegKeyValue, KeyValuePartialInformation, &kvpi, sizeof(kvpi), &kvpi.TitleIndex) &&
kvpi.Type == REG_DWORD && kvpi.DataLength == sizeof(DWORD))
{
elp = *(DWORD*)kvpi.Data != 0;
}
ZwClose(hKey);
}
}
return elp;
}
所以我的结论 - 只有从注册表设置依赖和绝对当前构建长路径的行为不是从应用程序清单依赖,尽管MSDN。
对于反对票 - 对我来说简单有趣 - 是否有人从您那里构建测试应用程序(带和不带清单)并自行测试,或者您只能阅读文档?
对于那些觉得困难,或者懒得自己写代码的人。你可以用这个代码进行测试:
BOOL CreateFolder(LPCWSTR lpPathName)
{
return CreateDirectoryW(lpPathName, 0) || GetLastError() == ERROR_ALREADY_EXISTS;
}
void LPT()
{
WCHAR name[128], path[0x8000], *c;
if (!SHGetFolderPath(0, CSIDL_PROFILE , 0, 0, path))
{
*name = '\\';
__stosw((PUSHORT)name + 1, '3', RTL_NUMBER_OF(name) - 2);
name[RTL_NUMBER_OF(name) - 1] = 0;
c = path + wcslen(path);
int n = 4;
do
{
memcpy(c, name, sizeof(name));
c += RTL_NUMBER_OF(name) - 1;
if (!CreateFolder(path))
{
break;
}
} while (--n);
if (!n)
{
wcscpy(c, L"\\1.txt");
HANDLE hFile = CreateFileW(path, FILE_GENERIC_WRITE, FILE_SHARE_VALID_FLAGS, 0, OPEN_ALWAYS, 0, 0);
if (hFile != INVALID_HANDLE_VALUE)
{
CloseHandle(hFile);
return ;
}
}
}
GetLastError();
}
和清单与<ws2:longPathAware>true</ws2:longPathAware>
测试,并在注册表中LongPathsEnabled==0
。它失败了?然后在没有清单的情况下进行测试,但在注册表中使用LongPathsEnabled==1
。工作?
如果让我在Windows 10版本1607构建14393.0
读线之间的文档测试,我认为理论是,你不需要知道。你能勾画出你认为这可能是一个问题的原因吗? –
要警告用户长路径不可用,并因此可能会出现不正确的行为。这是一个库项目,所以启用长路径的清单资源不一定存在。否则,它只是一个操作系统版本检查。 –
,但是如果使用格式为'\\?\\'的长路径,即使在XP中也是真正可用的路径 – RbMm