呼叫“系统”在C ++中
-
05-07-2019 - |
题
我在C ++中使用 system
命令来调用一些外部程序,每当我使用它时,控制台窗口会在命令完成后打开和关闭。
如何避免打开控制台窗口?如果解决方案可以与平台无关,我会很高兴。我还想让我的程序等到命令完成。
解决方案
听起来你正在使用Windows。
在Linux上(通常是* nix),我将分别用对 fork
和 exec
的调用替换对 system
的调用。 。在Windows上,我认为Windows API中有某种spawn-a-new-process函数,请参阅文档。
当您运行shell命令和/或外部程序时,您的程序很难与平台无关,因为它取决于具有您正在运行的命令和/或外部程序的平台。
其他提示
这可能是最简单也许是最好的方法,这也会使你的程序在运行此命令时不会冻结。 首先,不要忘记使用;
包含Windows标头#include <Windows.h>
然后您需要使用以下函数来运行命令;
WinExec("your command", SW_HIDE);
注; WinExec
方法已被弃用了十多年。它今天仍然可以正常工作。如果不需要,则不应使用此方法。
...而不是不想要使用的方式;
system("your command");
exec()看起来非常独立,因为它是POSIX。在Windows上,它是_exec(),而它是unix上的exec():参见 http://msdn.microsoft.com/en-us/library/431x4c1w(VS.71)的.aspx
ERRM。 CreateProcess
或 ShellExecute
。
这是一种在没有新的 cmd.exe
窗口的情况下执行命令的方法。基于 Roland Rabien的回答和 MSDN ,我写了一个工作函数:
int windows_system(const char *cmd)
{
PROCESS_INFORMATION p_info;
STARTUPINFO s_info;
LPSTR cmdline, programpath;
memset(&s_info, 0, sizeof(s_info));
memset(&p_info, 0, sizeof(p_info));
s_info.cb = sizeof(s_info);
cmdline = _tcsdup(TEXT(cmd));
programpath = _tcsdup(TEXT(cmd));
if (CreateProcess(programpath, cmdline, NULL, NULL, 0, 0, NULL, NULL, &s_info, &p_info))
{
WaitForSingleObject(p_info.hProcess, INFINITE);
CloseHandle(p_info.hProcess);
CloseHandle(p_info.hThread);
}
}
适用于所有Windows平台。像 system()
一样调用。
不隶属于 StackOverflow