ちぇりーの館

1−2 C言語プログラミング小ネタ講座 
プログラムの二重起動を防止する



今回の小ネタは、プログラムの二重起動を防止する方法です。プログラムによっては、複数個のプログラムが同時に起動する事によって、 不具合が発生する場合があります。一般的な対象方法は、『現在起動しているプログラムを調べ、同じプログラムが起動している場合には エラーメッセージを表示してプログラムを終了させる』方法がとられています。

・二重起動の防止サンプルプログラム

《ヘッダーファイル》
#include "windows.h"
#define   PROGRAM_TITLE    "GWProgram"                  //プログラムのタイトル名



《ソースファイル》
HANDLE hMutex;                                          //結果取得ハンドル

hMutex = CreateMutex( NULL, TRUE, "__GW__SYSTEM");      //現在の起動状態を取得

if(GetLastError() == ERROR_ALREADY_EXISTS)              //二重起動が見つかった場合
{
    MessageBox( NULL, "二重起動が見つかりました!", "テスト", MB_OK );
    HWND hWnd = FindWindow(NULL, PROGRAM_TITLE);        //親ウインドウを捜す
    if( hWnd != NULL )
    {
        SetForegroundWindow( hWnd );                    //親ウインドウをアクティブに設定
        ShowWindow(hWnd, SW_SHOWNORMAL);
    }
    return 1;                                           //プログラム終了
}

ReleaseMutex( hMutex );


プログラムの流れは、以下の通りです。

@ CreateMutex関数
 CreateMutex関数を使って、現在のプログラム起動状態を取得します。実際の処理はこの関数から得られた、ハンドルを取得して処理を行う……、訳ではなく この関数が実行された際に出力されるエラー内容を確認します。


< CreateMutex関数の引数説明 >
引数名名前内容
第一引数セキュリティ記述子子プロセスが、取得したハンドルを継承できるかどうかを決定します。基本的に、NULLをセットしておけば問題ありません。
第二引数最初の所有者初期の所有者を指定します。この設定がTRUEの場合、二回目に起動したプログラムは最初の所有者になれず、エラーを返します。
第三引数オブジェクトの名前ここで設定した文字列を頼りに、自分と同じプログラムが起動しているかを調べます。従って、全然別のプログラムであっても、 名前が偶然一致した場合には、二重起動と見なされてしまいます。なるべく名前は、かぶらないようにしましょう。

A 二重起動発見後の処理
 GetLastError関数から取得したエラー内容が、"ERROR_ALREADY_EXISTS"の場合、二重起動となります。ここで、メッセージを表示してプログラムを終了しても いいのですが、せっかくなので、はじめから起動されていたプログラムを最前列に表示してから、プログラムを終了するようにします。
B 起動プログラムを最前列に設定
別のウインドウ画面を操作する事になるので、まずはじめに操作する対象のウインドウハンドルを調べます。対象のウインドウを調べるためには、 FindWindow関数を使います。この関数の戻り値で取得されたウインドウハンドルを元に、ウインドウをアクティブ状態(ウインドウがクリックされて選択された状態) に設定します。アクティブ設定を行うのは、SetForegroundWindow関数で行います。また、選択されたウインドウが最小化されている場合も考えられるので、 ShowWindow関数を実行し強制的に画面を表示させれば選択されたウインドウが最前面に来た事になります。

C 後処理
最後に、ReleaseMutexで取得したハンドルを開放させれば終了となります。ちなみに、このハンドルをもつオブジェクトがプログラムの判別情報を持っているので、ReleaseMutexを実行する際には、 プログラムが終了する直前で行うようにします。







< 一覧ページへ戻る


当サイトが面白いと感じた方は、お手数ですが下記リンクをクリックしてください。
クリック毎に当ホームページの評価が上がります。ご協力お願いします!
inserted by FC2 system