如果启动某个可执行文件的上下文菜单项存在于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?我们可以在应用程序中构建正确的函数(。我的问题是炮弹是否能利用它,答案是——";还没有&";。这取决于外壳本身。