3

MSVS 2008 を使用しています。C でアプリケーションを作成していますが、Windows でアプリケーションを再起動する最善の方法を知りたいです。

私は周りを見回して、誰かがこのようなことをしていましたが、それが最善の方法なのか、それともまったく新しいプロセスを作成するのかさえわかりません.

    if(command == restart)
    {
        printf("program exiting!\n");
        Sleep(2000);
        system("cls");

        WinExec("my_app.exe", SW_SHOW);
        exit(0);
    }

ありがとう

4

3 に答える 3

1

これには、1 つのプロセスを追加する必要があります。

アプリケーションから、そのプロセスを起動します。メインアプリケーションが終了するのを待ってから、何が起こるか(更新など)を待ってから、再起動して自分自身を殺します。

何も更新できないため、アプリ自体を起動しても問題ありません。

于 2010-12-06T09:34:35.883 に答える
0

以下は、電卓の起動方法に関する馬鹿げた例です。

STARTUPINFO startUpInfo = { 0 };
PROCESS_INFORMATION procInfo = { 0 };

startUpInfo.cb = sizeof( startUpInfo );

while( 1 )
{
CreateProcess( L"C:\windows\System32\calc.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &startUpInfo, &procInfo );

WaitForSingleObject( procInfo.hProcess, INFINITE );
}

ご覧のとおり、これにより新しいプロセス「calc.exe」が開始されます。終了するのを待って、最初からやり直します。ここでハンドルを閉じていないことに注意してください!!!

于 2010-12-06T09:28:52.563 に答える
0

簡単な答え: 私には問題ないように見えますが、ソケットにバインドしている場合、親の exit() の前に 2 つのプログラムが衝突する可能性はごくわずかです。

「最善の」方法を尋ねると、「状況に依存する」という回答のいずれかが生成されるのではないかと心配しています。

まず、WinExec のMSDN ドキュメントによると、「この関数は 16 ビット Windows との互換性のためにのみ提供されています。アプリケーションは CreateProcess 関数を使用する必要があります」。これは、' exec ' のような関数の DOS 時代の関数ラッパーであることを意味します。もちろん、CreateProcess は MS だけが作成するモンスターのようなものですが、このアプリケーションが重要になる場合は、おそらくアドバイスに従う必要があります。

興味深いことに、MS は CreatProcess のドキュメントで、「プロセスをシャットダウンするための推奨される方法は、ExitProcess 関数を使用することです」と述べています。

ご覧のとおり、多くの問題と同様に、多くの解決策があります。ここでの回答を磨く可能性のある回答する質問は次のとおりです。

  • プラットフォームに依存しないことを気にしますか?
  • セキュリティを気にしますか?
  • このプログラムにどれだけの労力が必要か気にしますか?

それがあなたを助けることを願っています!

于 2010-11-17T23:04:17.490 に答える