[リストへもどる]
一括表示

投稿時間:2002/10/08(Tue) 07:58
投稿者名:にゅるくん。
Eメール:
URL :
タイトル:
フォームを持たないアプリの終了。
おはようございます。
今、アクセスの更新日を比較して、新しくなっていれば
自動的にコピーするというプログラムを作成しています。
PCが複数台あり、今までは手動でコピーしていたのですが、
めんどくさいということで、作成しました。
現在コピーするアプリは一応完成したのですが、
このアプリも、自動的に更新できないかと思っております。
このアプリはスタートアップでしか使わないので、フォームを持っていません。
コピーする為には、一度終了しないといけないんですが、方法が解りません。

一応、自分なり考えた方法は、アプリを2つ作成しました。
一つは判定部分(スタートアップ)、もう一つは実際のコピー作業

スタートアップで更新日を比較し、新しくなっていればコピーアプリを立ち上げる(shell)
その次にendで終了させるという方法をとりました。
が、終了する前にコピーをするみたいで、エラーがでます。
(msgboxなどで時間を一度ストップさせると、うまく動作します。)
ということなので、コピー側でスタートアップのアプリを終了の命令をだし、
終了の確認後、コピーを開始するということがしたいのですけれど、何か良い方法はありませんか?
よろしくお願いします。

投稿時間:2002/10/08(Tue) 12:05
投稿者名:Say
Eメール:
URL :
タイトル:
Re: フォームを持たないアプリの終了。
以前書いたと思いますが、EnabledをFalseにした
ダミーフォームをくっつけてはどうでしょう。
そうすればAPIを使って、
強制終了させることなく終わらせることができます。

手順としては、クラス名またはウィンドウキャプション名をもとに
FindWindowまたはEnumWindowsでターゲットのウィンドウハンドルを取得し、
そのハンドルに対し、WM_CLOSEをSendMessageする、というものです。

終了確認は、FindWindowでターゲットウィンドウがなくなったのを確認した後
数百ミリ秒待ってみてもいいですが、
GetWindowThreadProcessIdでウィンドウハンドルからプロセスIDを取得し、
OpenProcessでプロセスIDからプロセスハンドルを取得して、
WaitForSingleObjectに渡してやったほうがいいでしょう。

もし、ダミーウィンドウを作らないのなら、
TerminateProcessで強制終了することになりますが、
メモリに残骸が残るとかの不具合が発生する可能性があります。
(それよりは、ターゲットアプリ側に
「プロセス間通信で何らかのデータをうけたらExitProcessする」
ように作っておいて、植わらせたいときは、そのデータを贈りつけるほうが安全です。)

参考までに、プロセス間通信に関しては
「他のEXE間との連携で教えてください」スレッドに
キーワードを列挙してます。

投稿時間:2002/10/08(Tue) 18:37
投稿者名:にゅるくん。
Eメール:
URL :
タイトル:
Re^2: フォームを持たないアプリの終了。
なるほど!以前わからなかったことが、少しだけわかるようになってきました。
ありがとう御座います。

> GetWindowThreadProcessIdでウィンドウハンドルからプロセスIDを取得し、
> OpenProcessでプロセスIDからプロセスハンドルを取得して、
> WaitForSingleObjectに渡してやったほうがいいでしょう。

このへんが、さっぱりですが・・・・・。

でも、大変参考になりました。
m(__)m

投稿時間:2002/10/09(Wed) 00:25
投稿者名:Say
Eメール:
URL :
タイトル:
Re^3: フォームを持たないアプリの終了。
各API関数の詳細に関しては、プラットフォームSDKを
参照してもらうとして・・・。

OpenProcessの例なら、ここの「他のプロセスとの連携」の
「他のプログラムの終了を待つには」に使用例があります。
サンプルではループでGetExitCodeProcessの戻り値を監視してますが…。