我正在使用C ++中的system
命令调用一些外部程序,每当我使用它时,一个控制台窗口会在命令完成后打开并关闭。
如何避免打开控制台窗口?如果解决方案可以跨平台,我会很高兴。 我还希望我的程序等待命令完成。
我正在使用C ++中的system
命令调用一些外部程序,每当我使用它时,一个控制台窗口会在命令完成后打开并关闭。
如何避免打开控制台窗口?如果解决方案可以跨平台,我会很高兴。 我还希望我的程序等待命令完成。
这可能是最简单、也是最好的方法,同时您的程序在运行此命令时也不会冻结。 首先,不要忘记使用以下代码包含Windows头文件;
#include <Windows.h>
WinExec("your command", SW_HIDE);
注意:WinExec方法已经过时十多年了。虽然它今天仍然可以正常工作,但如果不需要,请不要使用此方法。
...而不是你不想使用的方式;
system("your command");
听起来你在使用Windows。
在Linux(和*nix系统中),我会将对system
的调用替换为分别对fork
和exec
的调用。在Windows上,我认为有一些可以生成新进程的函数在Windows API中,请查阅文档。
当你运行shell命令和/或外部程序时,你的程序很难做到平台无关性,因为它会依赖于平台是否具有你正在运行的命令和/或外部程序。
以下是一种可以不用新建 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()
相同。
嗯,CreateProcess
或者ShellExecute
。
exec() 看起来相当平台无关,因为它是 POSIX 标准。在 Windows 上,它是 _exec(),而在 Unix 上则是 exec():请参见 http://msdn.microsoft.com/en-us/library/431x4c1w(VS.71).aspx