2009-11-26 111 views
8

我用C使用system命令++调用一些外部程序,每当我使用它,控制台窗口将打开,命令结束后关闭时剿控制台。调用C“系统” ++

如何避免打开控制台窗口?如果解决方案可能与平台无关,我会很高兴。我还想让我的程序等到命令完成。

+0

重复更好的答案(对于Windows):http://stackoverflow.com/questions/1597289/hide-console-in-c-system-function-win – Steed 2014-07-04 07:42:49

回答

3

这听起来像你正在使用Windows。

在Linux(和通常的* nix)上,我将分别替换system的呼叫和forkexec。在Windows上,我认为在Windows API —中有一些spawn-a-new-process函数请参考文档。

当你运行shell命令和/或外部程序,你的程序是很难做平台无关的,因为这将取决于具有命令和/或你正在运行外部程序的平台。

+0

一般来说,你是正确的程序是平台依赖当使用shell命令时。但是,在这种情况下,我确保外部程序安装在我正在使用的机器上。这不是一个简单的shell命令。关于你的答案 - 可以在Windows中使用CreateProcess,在Unix中使用fork + exec,但我希望能够更优雅地解决这个问题。 – Dana 2009-11-26 09:22:00

+0

有关CreateProcess/fork + exec的优雅之处?如果你把它包装在一个不错的课堂上,你有一个非常优雅的方式来启动流程,再加上你可以轻松添加诸如重定向输出/输入等选项。 – stijn 2009-11-26 10:39:34

1

ERRM。 CreateProcessShellExecute

5

这可能是最简单的,也许是最好的方式,这也将让这个运行此命令,而你的程序也不会冻结。 起初不要忘记使用Windows头文件;

#include <Windows.h> 

然后您需要使用以下函数来运行您的命令;

WinExec("your command", SW_HIDE); 

注意; WinExec方法已被弃用了十多年。它今天仍然正常工作。如果不需要,您不应该使用此方法。

...而不是你的方式不要想用;

system("your command"); 
+2

我几乎没有将WinExec称为“最佳”方式,因为它已被弃用超过17年。 – 2012-03-13 14:58:58

+0

好吧,我不确定这是为什么我说也许 – 2012-03-13 15:04:13

+1

工作对我来说很好,即使不赞成,因为我正在寻找几个小时,所以我不得不高调起来。谢谢 – Demurgos 2014-02-01 09:57:35

0

这里有一个方法来执行没有新的cmd.exe窗口的命令。基于Roland Rabien's answerMSDN,我写了一个工作职能:

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()