克服Windows 7 shell MAX_PATH限制



如果启动某个可执行文件的上下文菜单项存在于Windows注册表中,并且提到了"%1"命令行patrometer占位符,则该可执行文件通过GetCommandLine()的路径仅限于MAX_PATH,在某些情况下,Windows会尝试将其作为短路径名称。

示例:

[HKEY_LOCAL_MACHINESOFTWAREClasses*shellshowpathcommand]
@=""C:\Program Files (x86)\Utilities\COMLINE.EXE" "%1""

当路径为:时

"\\SERVERMediaFilder25Philosophic20220407 Draft thoughts. Questions without answers on the background of the torn Internet20220407-1 Draft thoughts. Questions without answers on the background of the torn Internet20220407 Draft thoughts. Questions without answers on the background of the torn Internet.ysssss"

COMLINE。EXE将得到以下内容:

"\\SERVERMediaFilder2539FC~1202204~3202204~220220407 Draft thoughts. Questions without answers on the background of the torn Internet.ysssss"

现在string的长度不受限制。NTFS路径深度也不受限制。

如何克服这一点?

注册表中有一种允许长路径的方法,在这个URL中进行了解释。

我归结为以下注册表项:

[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlFileSystem]
"LongPathsEnabled"=dword:00000001

为了知道你的当前价值,你可以这样做:

reg query "HKLMSYSTEMCurrentControlSetControlFileSystem" | findstr "LongPathsEnabled"

它仅限于Windows 10、版本1607和更高版本,但您的问题是关于Windows 7的。

Windows 10,版本1607包含api-ms-win-core-path-l1-1-0.dll

api-ms-win-core-path-l1-1-0.dll有一个复制版本,可以像Windows 10 1607版本那样操作长路径。

此处提供源代码:https://github.com/nalexandru/api-ms-win-core-path-HACK

在将平台工具集切换到v110之后,我设法在Visual Studio 2012中编译了它,并成功地测试了它,例如,使用现在依赖于该DLL的Python 3.9。

我认为,Windows7 shell不能利用开箱即用的LongPathsEnabled注册表参数,应用程序应该直接使用这个DLL(但在这种情况下,为什么要使用DLL?我们可以在应用程序中构建正确的函数(。我的问题是炮弹是否能利用它,答案是——";还没有&";。这取决于外壳本身。

相关内容

  • 没有找到相关文章

最新更新