我试图让 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 包含 "<long absolute path>\foo.exe" foo
si 设置如下:
memset(&si,0,sizeof(si)); si.cb = sizeof(si); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE;>
并且 pi 为空,如下所示:
memset(&pi,0,sizeof(pi));
我查看了系统事件日志,每次尝试使用事件 id 59 进行此操作时都会出现一个新条目,源 SideBySide: Generate Activation Context failed for .Manifest。参考错误信息:操作成功完成。
我尝试执行的文件在 < MAX_PATH 字符的路径中运行良好。
澄清一下, <long absolute path> 的任何一个组成部分都不大于 MAX_PATH 个字符。可执行文件本身的名称当然不是,即使最后有 .manifest。但是,整个路径加起来的长度大于 MAX_PATH 个字符。
无论我是否嵌入其清单,我都会收到相同的错误。清单被命名为 foo.exe.manifest,当它没有嵌入时,它与可执行文件位于同一目录中。它包含:
<?xml 版本='1.0' 编码='UTF-8' 独立='yes'?> <程序集 xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'> <依赖> <依赖程序集> <assemblyIdentity type='win32' name='Microsoft.VC80.DebugCRT' version='8.0.50727.762' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' /> </dependentAssembly> </依赖> </汇编>
有谁知道如何让它工作?可能:
调用 CreateProcess 或 CreateProcessW 以在路径 > MAX_PATH 字符中执行进程的其他方式
我可以在清单文件中做的事情
我在 XP SP2 上使用 Visual Studio 2005 构建并运行本机。
谢谢你的帮助。