Windows 从长路径启动win32应用程序
为我的应用程序启用长路径支持,我已完成以下操作:Windows 从长路径启动win32应用程序,windows,manifest,long-path,Windows,Manifest,Long Path,为我的应用程序启用长路径支持,我已完成以下操作: 使用mt.exe将longPathAware清单嵌入到我的应用程序中 确保将LongPathsEnabled注册表项设置为1 实际上,我的应用程序开始能够对长路径超过260限制的文件夹中的文件进行操作,但是存在一个问题 我找不到启动应用程序的方法,因为长路径文件夹是我当前的工作目录。我试过使用cmd,MSYS2,CygWin,explorer cmd给出以下错误: The current directory is invalid. Error
mt.exe将longPathAware
清单嵌入到我的应用程序中
LongPathsEnabled
注册表项设置为1260
限制的文件夹中的文件进行操作,但是存在一个问题
我找不到启动应用程序的方法,因为长路径文件夹是我当前的工作目录。我试过使用cmd
,MSYS2
,CygWin
,explorer
cmd
给出以下错误:
The current directory is invalid.
Error: Current working directory has a path longer than allowed for a Win32 working directory.
Can't start native Windows application from here.
bash: /c/myapp: File name too long
MSYS2
和CygWin
都给出了以下错误:
The current directory is invalid.
Error: Current working directory has a path longer than allowed for a Win32 working directory.
Can't start native Windows application from here.
bash: /c/myapp: File name too long
explorer
执行以下操作:
- 应用程序图标变为空白,就像未知文件类型或没有扩展名的文件一样
- 双击应用程序不会产生任何效果
我觉得如果这个案例不起作用,整个长路径支持就没有任何意义。
SetCurrentDirectoryW
适用于长路径,但长路径不能被继承或设置为进程的初始工作目录。对于lpCurrentDirectory
不支持它。此外,必须在lpApplicationName
中传递一个长的可执行路径,该路径可以是相对路径。它不能仅在lpCommandLine
中传递,因为如果没有lpApplicationName
,API总是使用MAX\u PATH
(260)缓冲区调用SearchPathW
,即使命令行具有绝对路径。即使CreateProcessW
成功,在某些情况下,进程的初始化可能会失败(例如,进程和会话服务器之间的SxS激活上下文IPC,csrss.exe)。程序必须注意避免尝试生成工作目录为长路径的子进程,包括工作目录的隐式继承(即,lpCurrentDirectory
作为NULL
传递)简言之,从长路径运行应用程序是可能的,但有限、笨重甚至有缺陷(IMO)。我不会这样做。请改用连接或替代驱动器。@ErykSun谢谢您的评论。我有一个问题。到底是什么使用了CreateProcessW
?如果我直接从shell调用.exe,具体是什么生成了我的进程?对于cmd.exe,它在运行可执行文件时直接调用CreateProcessW
,使用或w没有start
。它根据PATH
和PATHEXT
实现自己对可执行文件的搜索,因此它总是在lpApplicationName
中传递可执行路径,而不是依赖CreateProcessW
来搜索它。但它也尝试在lpCurren>中继承当前目录t目录
,它不适用于长路径。start
命令可以通过/D
使用显式目录覆盖此目录,或者只使用不同工作目录的相对路径运行可执行文件。SetCurrentDirectoryW
适用于长路径,但长路径不能继承或设置为初始路径rking进程的目录。对于lpCurrentDirectory
不支持它。此外,必须在lpApplicationName
中传递一个长的可执行路径,该路径可以是相对路径。它不能仅在lpCommandLine
中传递,因为没有lpApplicationName
,API总是调用SearchPathW
w使用MAX_PATH
(260)缓冲区,即使命令行具有绝对路径。即使CreateProcessW
成功,在某些情况下,进程的初始化可能会失败(例如,进程和会话服务器之间的SxS激活上下文IPC,csrss.exe)。并且程序必须注意避免尝试生成工作目录为长路径的子进程,包括工作目录的隐式继承(即,lpCurrentDirectory
作为NULL
传递)。简而言之,从长路径运行应用程序是可能的,但有限、笨拙甚至有缺陷(IMO)。我不会这样做。请改用连接或替代驱动器。@ErykSun谢谢您的评论。我有一个问题。到底是什么使用了CreateProcessW
?如果我直接从shell调用.exe,具体是什么生成了我的进程?对于cmd.exe,它在运行可执行文件时直接调用CreateProcessW
,使用或w没有start
。它根据PATH
和PATHEXT
实现自己对可执行文件的搜索,因此它总是在lpApplicationName
中传递可执行路径,而不是依赖CreateProcessW
来搜索它。但它也尝试在lpCurren>中继承当前目录t目录
,它在长路径下不起作用。start
命令可以通过/D
使用显式目录覆盖此目录,或者只使用不同工作目录的相对路径运行可执行文件。