Home | Top | Prev Story | Next Story

1999.3.29(Mon)
第5話
多重起動を防止せんとな

(1/2)
もしもし、わしゃフクロウじゃ。
まだ名はないがの。
分かってるってか?
一応、お約束ってことにしようかと思ってな。
ほ〜っほっほっほ。
前回はどこまでだったかのぉ...
最近、年のせいか物忘れがはげしくてのぉ。
アイコン作って、Aboutダイアログを用意したとこじゃったな。

じゃ、今回は「多重起動の防止方法」についてでも教えてやるかの。
早く本題に入っていって欲しいじゃろうが、そんなことして りき丸くんを落ちこぼれさす訳にもいかんでな。
ほ〜っほっほっほ。

試しに今までに作ったMirrorWeb.exeを2回起動してみてくれんかの。
2回とも立ち上がってくるじゃろ?
2回だけじゃなくて、起動した分だけ立ち上がってくるんじゃがの。

Windowsアプリケーションには、複数も起動できてしまうと不都合が起きる場合があるんじゃ。
片方で処理中に、もう片方で処理してしまうと困るわけじゃな。

例えばMirrorWebの場合、片方でサーバのファイルを更新中に、もう片方でサーバからファイルをダウンロードしてしまったとしよう。
タイミングによってはうまく行くかもしれんが、サーバと自分のPCにあるファイルが、ごちゃごちゃになってしまうわけじゃな。

複数起動されたプログラム同士が、うまく同期を取って処理するという方法も考えられるかもしれんが、多重起動を防止して回避するという方法もある。
MirrorWebの場合、多重起動が防止してあれば十分じゃろ。
さてその防止方法なのじゃが、Windows内にMutexというグローバルなオブジェクトを作り出すんじゃ。
で、起動時にMutexオブジェクトが存在するかどうかを判定すれば、MirrorWebが既に起動されているかどうかが分かるというわけじゃ。
この防止処理は、「CMirrorWebApp」クラスの「InitInstance()」メンバ関数、「ExitInstance()」メンバ関数に手を入れて実現できる。
何故それらのメンバ関数に手を入れるのかは、この第5話後半で述べることにして、まずは手順だけをお伝えすることとしようかのぉ。

まずはInitInstance()への処理の追加じゃ。
以下のコードを、MirrorWeb.cppのCMirrorWebApp::InitInstance()へ追加して欲しい。
場所は
---------------------------------
// 標準的な初期化処理
// もしこれらの機能を使用せず、実行ファイルのサイズを小さく
// したければ以下の特定の初期化ルーチンの中から不必要なもの
// を削除してください。
---------------------------------
というコメントの直後が良いじゃろ。

ファイルを開くには、左側のペインから「FileView」->「MirrorWebファイル」->「Source Files」から「MirrorWeb.cpp」をダブルクリックするだけじゃ。

--------<InitInstance()へ追加するコード>-------
CString strCaption;
HANDLE hPrevMutex = OpenMutex(MUTEX_ALL_ACCESS,FALSE,_T("h_MIRRORWEB_PrevInstance"));
if(hPrevMutex != NULL){
CloseHandle(hPrevMutex);
return FALSE;
}
hExeCheckMutex = CreateMutex(FALSE,0,"h_MIRRORWEB_PrevInstance");
--------<InitInstance()へ追加するコード>-------
次はExitInstance()への処理の追加じゃが、MirrorWeb.cppのどこを見てもそんなものありゃせんじゃろ?
ほ〜っほっほっほ。
当たり前じゃ、ちゃんとおぬしが用意せねばの。
[表示]->[ClassWizard]、またはCtrl+Wキーで「ClassWizard」を開くのじゃ。
「オブジェクトID」に「CMirrorWebApp」、「メッセージ」に「ExitInstance」を選択し、「関数の追加」ボタンを押すわけじゃ。
さらにそこから「コード編集」ボタンを押す。
するとCMirrorWebAppにExitInstance()が追加された上に、ExitInstance()の場所が画面に開かれるはずじゃ。
ほ〜っほっほっほ。
すごいじゃろ?
当たり前じゃ、わしはフクロウ、名はないがな。
でもって
「// TODO: この位置に〜〜〜」
と書いてあるコメントの直後に次のコードを加えるんじゃな。
--------<ExitInstance()へ追加するコード>---------
ReleaseMutex(hExeCheckMutex);
--------<ExitInstance()へ追加するコード>---------
できたかの?
まだまだ続くぞい。
ほ〜っほっほっほ。

次へすすむ