我正在为 Windows (7) 编写一个应用程序,它必须运行许多只能使用系统调用才能完成的“dos 样式”命令行程序。当我运行系统调用时,大黑框弹出然后消失。它使执行看起来超级草率而且慢得多(我确实喜欢其中的 25 个,而且看起来很糟糕)我想将它们完全隐藏在屏幕上并让它们运行......有没有办法做到这一点?我已经翻遍了,我找不到任何关于这个的..
谢谢!
我正在为 Windows (7) 编写一个应用程序,它必须运行许多只能使用系统调用才能完成的“dos 样式”命令行程序。当我运行系统调用时,大黑框弹出然后消失。它使执行看起来超级草率而且慢得多(我确实喜欢其中的 25 个,而且看起来很糟糕)我想将它们完全隐藏在屏幕上并让它们运行......有没有办法做到这一点?我已经翻遍了,我找不到任何关于这个的..
谢谢!
代替system
,您可以使用ShellExecute
并指定SW_HIDE
。或者,您可以使用CreateProcess
并指定DETACHED_PROCESS
. 下面是一段演示代码,它为您在命令行中指定的可执行文件创建了一个分离的进程:
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdio.h>
void system_error(char *name) {
// Retrieve, format, and print out a message from the last error.
// The `name' that's passed should be in the form of a present tense
// noun (phrase) such as "opening file".
//
char *ptr = NULL;
FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
0, GetLastError(), 0, (char *)&ptr, 1024, NULL);
printf("\nError %s: %s\n", name, ptr);
LocalFree(ptr);
}
PROCESS_INFORMATION p;
BOOL WINAPI die(DWORD reason) {
TerminateProcess(p.hProcess, 1);
return TRUE;
}
int main(int argc, char **argv) {
STARTUPINFO s;
memset(&s, 0, sizeof s);
s.cb = sizeof(s);
if (!CreateProcess(argv[1], argv[2], NULL, NULL, TRUE,
DETACHED_PROCESS, NULL, NULL, &s, &p))
{
system_error("Spawning program");
return 1;
}
SetConsoleCtrlHandler(die, TRUE);
WaitForSingleObject(p.hProcess, INFINITE);
return 0;
}
如果您在这些命令行完成的任务之间存在依赖关系,则最好使用 CreateProcess 或 ShellExecuteEx,因为它们将允许您在结果进程句柄上使用 WaitForSingleObject,如此处所述。因此,您可以等待一项任务完成,然后再开始下一项。