アプリケーションの再起動

[戻る]
Sunday2号 2002/09/16(月) 23:41:07
はじめまして。ちょっとお伺いしたいことがあります。

プログラムの中で、ある条件を満たした上で、PostQuitMessage()によってアプリケーシ
ョンを終了して無起動状態を維持して、一定時間後に再起動するという処理をしたいの
ですが、こんなのって可能でしょうか。可能でしたら再起動する部分(API関数など)が
とくにわからないので教えてもらえないでしょうか。よろしくお願いします。

開発は、WINDOWS200,VC++6.0,SDK。

tib 2002/09/18(水) 16:32:28
# ...Windows2000 ですよね?

ATコマンドを呼び出して次回起動を予約する、というのはアリでしょうか。Scheduler
サービスが動いていなきゃダメとか、ユーザー権限によっては使えない...といった制限
はありますけど。

Sunday2号 2002/09/19(木) 00:04:47
レスどうもです。

>ATコマンドを呼び出して次回起動を予約する・・・
>Schedulerサービスが動いていなきゃ・・・

この辺は聞きなれない言葉なので(無知でごめん)、もう少し具体的な説明があるとい
いのですが・・・(主にWindows2000及びXP(98SEもあり)使用)

tib 2002/09/19(木) 12:23:38
ATコマンド:
スタートメニュー > プログラム > アクセサリ > コマンドプロンプト、でDOS窓開いた
ら、「AT /?」と入力してみてください。

Schedulerサービス:
スタートメニュー > 設定 > コントロールパネル > 管理ツール > サービス、でサービス
ダイアログを開いたら「Task Scheduler」というサービスがありませんか?

Sunday2号 2002/09/21(土) 11:52:36
ATコマンド、Schedulerサービスについて確認してみました。
使い方はよくわからないのですが、予め起動時間を予約しておくものだと使えないよう
な気がします。再起動時間は不定なので・・・。
具体的には、ユーザーがある操作をした時点でスレッドを終了し、そこから一定時間経
過後(数秒〜)に再起動するといった感じになります。

心あたりのあるものがあれば、よろしくお願いします。

kazuma 2002/09/21(土) 16:44:31
ウィンドウを非表示にして常駐しておくわけにはいかないのでしょうか?

あるいは、もう1つ別のプログラムを作って、それを常駐させておき、
数秒後に元のアプリを起動させるというのはどうでしょうか?

Sunday2号 2002/09/21(土) 17:39:04
ありがとうございます。

スレッドの完全終了、再起動(ユーザー操作の反映も含めたいので....)がベストなので
すが、ShowWindow(hWnd,SW_HIDE)で非表示にする方向も考えてみます。

疑問点がでればまたタイトル名をつけてご指導をお伺いすることにします。

kazuma 2002/09/22(日) 01:06:20
> あるいは、もう1つ別のプログラムを作って、それを常駐させておき、
> 数秒後に元のアプリを起動させるというのはどうでしょうか?

「数秒後」ではなくて、「一定時間経過後(数秒〜)」の間違いでした。

こちらの方法だと、元のプロセスを完全に終了させてから一定時間後に再び起動できます。
1. AからBを起動
2. Aを終了
3. 一定時間後にBからAを起動
という流れです。

Sunday2号 2002/09/23(月) 22:30:01
> あるいは、もう1つ別のプログラムを作って、それを常駐させておき... ...

仕様として興味はあるのですが、具体的にどのようなプログラムを作ればいいの
か... ...
作るとしたら簡単なもので邪魔にならないものが前提になると思うのですが、ちょっと
うかばないです。例を頂ければうれしいです。

PATIO 2002/09/24(火) 11:19:53
>> あるいは、もう1つ別のプログラムを作って、それを常駐させておき... ...

>仕様として興味はあるのですが、具体的にどのようなプログラムを作ればいいの
>か... ...
>作るとしたら簡単なもので邪魔にならないものが前提になると思うのですが、ちょっと
>うかばないです。例を頂ければうれしいです。

この方法は比較的普通に使われている方法だと思いますよ。
リモートでプログラムをアップデートした時に再起動する場合など。
ウイルス対策ソフトのオンラインアップデートのプログラムは大概そうです。
関連する関数周りを一度調べてみてある程度当たりをつけてから質問された方が
いいと思いますよ。
今のままでは始めから最後まで丸投げされているような印象を受けますので。

dairygoods 2002/09/24(火) 11:38:41
難しく考えなくても、こんなのでもよいのでは?

int main(int argc, char** argv)
{
  Sleep(atoi(argv[0]));
  WinExec(argv[1], SW_SHOW);
  return 0;
}

Sunday2号 2002/09/25(水) 08:54:07
みなさん、ありがとうございます。

皆さんの提案のものとは違うのですが、とりあえず、以下のようなことを試みました。
具体的には、手順として、@メイン画面を消す、Aメイン画面のクライアント領域に貼
っている子供ウインドウのみ破棄する、B待機時間の設定、C子供ウインドウの作り直
し、Dメイン画面の表示

コードは、
ShowWindow(hWnd,SW_HIDE); //@
DestroyWindow(hKodomo); //A
Sleep(); //B
SendMessage(hWnd,WM_CREATE,wParam,lParam); //C        
SendMessage(hWnd,WM_SIZE,wParam,lParam); //C(親とのサイズ合わせ)    
ShowWindow(hWnd, SW_SHOW); //D
です。

アプリ自体は完全終了していないのですが、子供が完全終了しているので初期の目的は
達成されています。
こういうのは邪道でしょうか?プログラム的に問題はないのでしょうか?

また、WinExec関数も試してみたのですが、なぜか二重起動防止に引っかかって起動でき
なかったです。二重起動防止を取り除くとうまくいくのですが... ...

うーん
>もう1つ別のプログラムを作って、それを常駐させておき... ...
がベスト?

古いスレッドには追加発言できません。