質問

私が使っているのは、 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()と同じように呼び出します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top