2

私の wxWidgets アプリケーションでは、コマンド ライン引数をチェックしています。見つかった場合は、アクションを実行してからウィンドウを閉じます。ただし、アプリケーションを適切に閉じることができないようです。3 などの終了コードでプログラムを終了したいです。wxApp::OnInit のコマンド ライン パラメータを確認するときに、単に を呼び出そうとしましたがexit(3)、wxwidgets 内のどこかでメモリ リークが発生したため、これは不適切なようでした。 .

次に、終了コードを保存し、OnRun をオーバーライドしてそこに戻ろうとしましたが、そうすると、 のinit.cpp472でクラッシュが発生しreturn wxTheApp->OnRun();ます。

アプリケーションを閉じる必要があることを検出した後、wxApp からのカスタム終了コードを使用してアプリケーションを適切に閉じる方法を知っている人はいますか? もオーバーロードしようとしましたがwxApp::OnExit、オーバーロードしていなくても呼び出されることはありませんOnRun

http://codepad.org/WYiOJq55のコード例は、何らかの理由でこの投稿でコードが許可されていないためです

コードの編集貼り付け:

int SomeApplication::OnRun()
{
    if(mExitCode != 0)
    {
        ExitMainLoop();
        return mExitCode;
    }
    else
        return wxApp::OnRun();
}
4

2 に答える 2

2

あなたのコメントによると、あなたは wxFrame を起動したことがなく、できるだけ早くアプリケーションを終了したいと考えているようです。これを行うには、SomeApplication初期化用のコンストラクターを にmExitCodeします0。次にOnInit、コマンドライン引数のチェックを行います。チェックの直後にアプリケーションを閉じたい場合はmExitCode、終了コードとreturn truefromを設定しますOnInit

以下は、OnRun別のウィンドウを開かずに関数がどのように機能するかです。

int SomeApplication::OnRun()
{
    if(mExitCode == 0)
        wxApp::OnRun();

    return mExitCode;
}
于 2012-05-02T22:23:59.387 に答える
1

このようにwxAPP::OnRun()をオーバーライドすると:

int MyApp::OnRun()
{
    wxApp::OnRun();
    return 3;
}

すべてがうまく機能します

小さなバッチファイルを作成すると

minimal.exe
echo el is %ERRORLEVEL%

期待どおりの結果が得られます

>test.bat

>minimal.exe

>echo el is 3
el is 3

私はあなたのコードの問題だと思います

int SomeApplication::OnRun()
{
    if(mExitCode != 0)
    {
        ExitMainLoop();
        return mExitCode;
    }
    else
        return wxApp::OnRun();
}

終了コードをチェックする前に基本クラスOnRunを呼び出していないということです。おそらく、wxAPP :: OnRun()によって実行されるコードのどこかに設定されています。

だから私はこれがあなたのために働くと思います

int SomeApplication::OnRun()
{
    wxApp::OnRun();
    return mExitCode;
 }
于 2012-05-01T17:45:18.467 に答える