C++ で「system」を呼び出すときにコンソールを抑制する
-
05-07-2019 - |
質問
私が使っているのは、 system
C++ でコマンドを使用して外部プログラムを呼び出すと、それを使用するたびにコンソール ウィンドウが開き、コマンドの終了後に閉じます。
コンソール ウィンドウを開かないようにするにはどうすればよいですか?ソリューションがプラットフォームに依存しないようにできれば幸いです。また、コマンドが完了するまでプログラムを待機させたいと考えています。
解決
Windowsを使用しているようです。
Linux (および *nix 全般) では、この呼び出しを次のように置き換えます。 system
への通話で fork
そして exec
, 、 それぞれ。Windows では、Windows API に何らかの新しいプロセス生成関数があると思います。ドキュメントを参照してください。
シェル コマンドや外部プログラムを実行している場合、プログラムは実行しているコマンドや外部プログラムが存在するプラットフォームに依存するため、プラットフォームに依存しないようにするのは困難です。
他のヒント
これはおそらく最も簡単で、おそらく最良の方法です。これにより、このコマンドの実行中にプログラムがフリーズしないようになります。 最初に、Windowsヘッダーを含めることを忘れないでください;
#include <Windows.h>
次に、次の関数を使用してコマンドを実行する必要があります。
WinExec("your command", SW_HIDE);
注; WinExec
メソッドは10年以上使用されていません。しかし、今日でも正常に機能します。必要でない場合は、このメソッドを使用しないでください。
... 使用したくない方法ではなく、
system("your command");
exec()はPOSIXであるため、プラットフォームにまったく依存しません。 Windowsでは、_exec()であり、unixではexec()です。 http://msdn.microsoft.com/en-us/library/431x4c1w(VS.71).aspx
エラー。 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()
と同じように呼び出します。