【发布时间】:2015-03-04 13:10:15
【问题描述】:
我看过这些解决类似问题的帖子:From Python 和 Extract Silently 和 Command Line Option
没有解决我的具体问题。
我想在一个用 ANSI C 编写的应用程序中调用 7za.exe(可能还有其他 console 应用程序,默认情况下会在 shell 命令窗口中生成)没有为每个调用弹出 shell 提示窗口。在 Windows 命令 shell 中,我可以将 > nul 附加到 7za 的命令行调用的末尾,它会抑制所有内容,如下所示:
但是,我需要从 Windows 应用程序循环调用它(数百次),导致 Windows 启动 shell 时不断闪烁,然后在命令完成时将其杀死。
到目前为止,我已经尝试附加> nul,就像我在上面的命令提示符图像中说明的那样,然后使用system() 命令,以及在另一个进程中启动exe 的修改后的系统命令:
sprintf(command, "7za.exe x -y -o%s %s > nul", filepathUnComp, filepath);
system(command);
或:
SystemX(command);
在哪里定义了 SystemX:
int SystemX(command)
{
STARTUPINFO sj;
PROCESS_INFORMATION pj;
int exit;
ZeroMemory( &sj, sizeof(sj) );
sj.cb = sizeof(sj);
ZeroMemory( &pj, sizeof(pj) );
if(CreateProcess(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &sj, &pj) == 0)
{
//AED_GetErrorMessage(AEDNV_FAILED_CREATE_PROCESS,cmd);
return -1;
}
// Wait until child processes exit.
WaitForSingleObject( pj.hProcess, IGNORE ); //ingnore signal
//Get exit code
GetExitCodeProcess(pj.hProcess, (LPDWORD)(&exit));
return exit;
}
这两种方法都会导致 shell 提示窗口闪烁。
有没有办法在应用程序中完全静默运行7za.exe,即不实例化shell 命令窗口闪烁?
如果使用 7za 无法做到这一点,我也愿意听取其他方法。
【问题讨论】:
-
不,这是不可能的。您正在启动一个外壳程序,它必须启动窗口。
> nul不会“隐藏”那个窗口。一个窗口不是程序的“输出”,它是程序输出的地方,如果你没有将它重定向到 nul。 -
@MarcB 您知道除 7za(或类似)以外的方法吗?我对完全不同的方法持开放态度,而不是局限于使用 7za。
-
相关:stackoverflow.com/questions/12010103/…,但 start 本身将在 shell 中运行并导致创建自己的窗口。基本上你必须绑定到 windows api 来启动没有窗口的后台进程。
-
如果你环顾四周,我相信你会发现一些 appropriate
CreateProcessflag 可以用来告诉CreateProcess不要创建任何控制台窗口。 -
@JoachimPileborg - 我认为您的链接显示了一些可能性。谢谢