gpt4 book ai didi

winapi - 如何让 CreateProcess/CreateProcessW 在路径 > MAX_PATH 字符中执行进程

转载 作者:行者123 更新时间:2023-12-02 00:46:58 25 4
gpt4 key购买 nike

我试图让 CreateProcess 或 CreateProcessW 执行名称 < MAX_PATH 字符但路径大于 MAX_PATH 字符的进程。根据文档: http://msdn.microsoft.com/en-us/library/ms682425.aspx ,我需要确保 lpApplicationName 不是 NULL,然后 lpCommandLine 最多可以有 32,768 个字符。

我试过了,但我得到 ERROR_PATH_NOT_FOUND。

我更改为 CreateProcessW,但仍然出现相同的错误。当我用\\?\前缀 lpApplicationName 时,如 中所述http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx当调用 CreateProcessW 时,我得到一个不同的错误,让我觉得我更接近了:ERROR_SXS_CANT_GEN_ACTCTX。

我对 CreateProcessW 的调用是:

CreateProcessW(w_argv0,arg_string,NULL,NULL,0,NULL,NULL,&si,&ipi);

其中 w_argv0 是 \\?\<long absolute path>\foo.exe.
arg_string 包含 "<长绝对路径>\foo.exe"foo

si 设置如下:

memset(&si,0,sizeof(si));
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWINDOW;
si.wShowWindow = SW_HIDE;>

并且 pi 是空的,例如:

memset(&pi,0,sizeof(pi));

我查看了系统事件日志,每次尝试使用事件 ID 59 进行此操作时,都会有一个新条目,源 SideBySide: Generate Activation Context failed for .Manifest。引用错误消息:操作成功完成。

我试图执行的文件在路径 < MAX_PATH 字符中运行良好。

澄清一下,<长绝对路径> 的任何一个组件都不大于 MAX_PATH 字符。可执行文件本身的名称当然不是,即使最后是 .manifest。但是,整个路径加起来大于 MAX_PATH 个字符。

无论我是否嵌入其 list ,我都会遇到同样的错误。 list 被命名为 foo.exe.manifest,当它没有被嵌入时,它与可执行文件位于同一目录中。它包含了:



<依赖>
<从属程序集>





有谁知道如何让这个工作?可能:

  • 调用 CreateProcess 或 CreateProcessW 以在路径中执行进程的其他方法 > MAX_PATH 个字符
  • 我可以在 list 文件中做的事情

  • 我在 XP SP2 上使用 Visual Studio 2005 构建并运行 native 。

    谢谢你的帮助。

    最佳答案

    嵌入 list 并使用 GetShortPathNameW 为我做到了。仅靠其中之一是不够的。

    在使用\\? 前缀的进程的绝对路径名作为第一个参数调用 CreateProcessW 之前,我检查:

    wchar_t *w_argv0;
    wchar_t *w_short_argv0;

    ...

    如果(wcslen(w_argv0)> = MAX_PATH)
    {
    num_chars = GetShortPathNameW(w_argv0,NULL,0);
    如果(num_chars == 0){
    syslog(LOG_ERR,"GetShortPathName(%S) 获取大小失败 (%d)", w_argv0,GetLastError());
    /*
    **不妨继续尝试使用长名称
    */
    } 别的 {
    w_short_argv0 = malloc(num_chars * sizeof(wchar_t));
    memset(w_short_argv0,0,num_chars * sizeof(wchar_t));
    if (GetShortPathNameW(w_argv0,w_short_argv0,num_chars) == 0) {
    syslog(LOG_ERR,"GetShortPathName(%S) failed (%d)",w_argv0, GetLastError());
    免费(w_short_argv0);
    w_short_argv0 = NULL;
    } 别的 {
    系统日志(LOG_DEBUG,“对 %S 使用短名称 %S”,w_short_argv0,w_argv0);
    }
    }
    }

    然后调用 CreateProcessW(w_short_argv0 ? w_short_argv0 : w_argv0...);

    记得要释放(w_short_argv0);然后。

    这可能无法解决所有情况,但它可以让我产生比以前更多的子进程。

    关于winapi - 如何让 CreateProcess/CreateProcessW 在路径 > MAX_PATH 字符中执行进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/142750/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com