所以,我有一小段 C 代码在 Windows 盒子上运行,上面写着:
/* invoke command */
impl->procHandle = _spawnve(_P_NOWAIT, command, vargs, env);
if (impl->procHandle == -1) {
printf("Failed to invoke command: %s\n", strerror(errno));
impl->busy = false;
}
printf("VICTORY\n");
我围绕这个写了一些单元测试,我的“命令”是 C:\windows\system32\ipconfig.exe 并且它可以工作,没问题。
试图将其用于应用程序启动器... doo doo。因有用的错误而失败:
The application failed to initialize properly (0xc0150004).
Click on OK to terminate the application.
好的...四处搜索我发现错误代码是STATUS_SXS_ASSEMBLY_NOT_FOUND,当我尝试启动notepad.exe时也会发生这种情况。缺少程序集?
为什么会这样?
我该如何解决它?
我只是在这里猜测,但我怀疑它与需要在 _spawnve() 中设置 PATH 变量有关,但我不知道它应该是什么。我尝试通过路径,但这似乎没有帮助。运行此代码:
int offset = 0;
while (vargs[offset] != NULL) {
printf("vargs %d: %s\n", offset, vargs[offset]);
++offset;
}
offset = 0;
while (env[offset] != NULL) {
printf("env %d: %s\n", offset, env[offset]);
++offset;
}
产量:
vargs 0: C:\windows\system32\notepad.exe
env 0: PATH=c:\WINDOWS\system32
IE。我传入 argv[0] 和一个路径值;不是其他环境变量或参数。
有任何想法吗?
--
编辑:
因此,似乎发生此错误是因为当我使用 _spawnve() 调用命令时未正确设置 PATH。
这通过调用 _spawnv() 或 _spawnvpe() 变得明显,这两者似乎都可以正常工作。
但是,这并没有真正帮助我,因为我需要在应用程序运行时为其指定一个额外的 PATH 组件。将 PATH=... 传递给 _spawnvpe() 会导致相同的错误,显然 _spawnv 没有被使用,因为它不允许您指定 PATH。
所以真的,这个问题的答案是:因为 PATH 变量是错误的。
...但我仍然不知道它应该是什么。似乎没有我在任何地方都可以找到的可行示例。我将接受任何链接到使用 _spawnve() 或 _spawnvpe() 的编码示例并将 PATH 变量传递给它(并且工作)的答案。
编辑#2:
真的。不,实际上,这不起作用。这是它不起作用的示例。忘记链接到一个有效的例子;只需修改我的示例并发布一个差异,即 1) 通过 PATH 和 2) 运行没有错误。
NB。想看看它的工作吗?更改为 _spawnv() 或将 env 值设为 NULL,它运行得很好。
#include <stdio.h>
#include <windows.h>
#include <process.h>
#include <errno.h>
int main(int argc, char *argv[]) {
char *path_value;
char buffer[4000];
const char *env[2];
const char *args[1];
char *command;
int result;
intptr_t procHandle;
path_value = getenv("PATH");
sprintf(buffer, "PATH=%s", path_value);
env[0] = buffer;
env[1] = NULL;
args[0] = NULL;
int offset = 0;
while (env[offset] != NULL) {
printf("env %d: %s\n", offset, env[offset]);
++offset;
}
offset = 0;
while (args[offset] != NULL) {
printf("arg %d: %s\n", offset, args[offset]);
++offset;
}
command = "C:\\windows\\system32\\notepad.exe";
procHandle = _spawnvpe(_P_NOWAIT, command, args, NULL);
if (procHandle == -1) {
printf("Failed to invoke command: %s\n", strerror(errno));
exit(1);
}
_cwait(&result, procHandle, 0);
if (result != 0)
printf("Command exited with error code %d\n", result);
}
输出:
env 0: PATH=.;c:\Program Files\Common Files\Microsoft Shared\Windows Live;c:\WINDOWS\system32;c:\WINDOWS;c:\WINDOWS\System32\Wbem;c:\Program Files\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\DTS\Binn\;c:\Program Files\CMake 2.8\bin;c:\Program Files\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\;c:\Program Files\Common Files\Microsoft Shared\Windows Live
Command exited with error code -1072365564