4

動作する C++ MFC プログラムがありますが、コマンド ラインからより単純なバージョンを起動できるようにしたいと考えています。(これは、cmd ライン引数がある場合、cmd ライン バージョンを使用して機能します。) プログラムで、実行するために開いている現在の「cmd」ウィンドウを使用し、そのための新しいシェルをある程度作成したいと考えています。InitInstance() では、私は...

CString cmdLine;
cmdLine.Format("%s", this->m_lpCmdLine);
if(cmdLine.IsEmpty())
    dlg.DoModal(); // Run application normally
else
{
    CString header = "Welcome to the program!";
    AttachConsole(ATTACH_PARENT_PROCESS);     // Use current console window
    LPDWORD charsWritten = 0;
    WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), header, header.GetLength(), NULL, NULL);
}

プログラムへの入力を取得するにはどうすればよいですか? cin は動作しないようです。私はこのようなことを試しました:

char input[10] = "";
while((strcmp(input, "q") != 0) && (strcmp(input, "quit") != 0))
    scanf("%s", input);

しかし、コマンド ウィンドウが新しいプロンプトを待機しているため、機能していないようです。

4

1 に答える 1

4

根本的な問題は、MFC プログラムが EXE ヘッダーでコンソール モード プログラムとしてマークされていないことです。そのため、コマンド プロセッサは、コンソール モード プログラムの場合とは異なり、完了するまで待機する必要がありません。これで、コンソールから読み取ろうとしている2 つのプログラム、あなたと cmd.exe ができました。あなたは負けます。

いくつかの回避策がありますが、どれも魅力的ではありません:

  • でプログラムを開始しますstart /wait yourapp.exe arg1 arg2...
  • Linker + System + SubSystem 設定を Console に変更します。引数がないことがわかったら、FreeConsole を呼び出します。フラッシュはちょっと厄介で、Java プログラマーにはよく知られています
  • 引数があることがわかったら、AllocConsole() を呼び出します。あなたはあなた自身のコンソールを手に入れるでしょう。
于 2012-10-17T22:02:41.133 に答える