Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 从长路径启动win32应用程序_Windows_Manifest_Long Path - Fatal编程技术网

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
    注册表项设置为1
  • 实际上,我的应用程序开始能够对长路径超过
    260
    限制的文件夹中的文件进行操作,但是存在一个问题

    我找不到启动应用程序的方法,因为长路径文件夹是我当前的工作目录。我试过使用
    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
    使用显式目录覆盖此目录,或者只使用不同工作目录的相对路径运行可执行文件。