多重起動チェック

ども、Norimakiです。
とりあえず今回は多重起動チェックを。

ミューテックスを使って多重起動チェックをする方法があるそうです。
どこからかコードを引っ張ってきて書いたものです。

どこから引用したものか失念してしまいました。

では、コードを。

これは僕が使っているコードですので、そのままコピペでは使えません。
必要に応じて書き換えて使用してください。

function NP_CheckMutex:boolean;
var
  hMutex :THandle;
begin
 //------------------------------
 // 内部処理(多重起動防止対策)
 //------------------------------
 //多重起動フラグチェック(多重起動許可ならTrueでExit)
 Result:=NV_MultiRunning;
 if Result then exit;

 //メインフォームクラス名定義チェック
 //ここに来る時点で既にResult=Falseになっている
 //クラス名が定義されていない場合は致命的エラーコードを設定の上 Exit
 if NV_MainFormClassName='' then begin
  NV_FatalErrorCode:=Ord(ecNotSetMainFormClassName);
  exit;
 end;

 //多重起動チェック
 //既に起動していたら致命的エラーコードを設定する
 hMutex:=CreateMutex(nil, False, PWideChar(NV_MainFormClassName));
 Result:=not (WaitForSingleObject(hMutex,0)=WAIT_TIMEOUT);
 if not Result then NV_FatalErrorCode:=Ord(ecApplicarionAlreadyRunning);

end;

多重起動をチェックし多重起動していればFalseを返す関数です。
(正確にはアプリケーション起動チェックをする関数です)

しかし、多重起動を許すフラグ(NV_MultiRunning)が立っていたら
多重起動していてもTrueが返ってきます。

この関数を呼び出す際は、メインフォームのクラス名を
NV_MainFormClassNameという変数に設定した上で呼び出します。
設定されていない場合は致命的エラーコードを設定して戻ります。

ミューテックスなるもので多重起動をチェックし、
多重起動であれば致命的エラーコードを設定し戻ります。

致命的エラーコードを設定する変数は、NV_FatalErrorCodeという変数です。
致命的エラーについてはこんな感じで、NY_Application.pas で設定してあります。

type
  //-----------------------------
  // システムエラーコード設定
  //-----------------------------
  _ErrorCode   =(ecNormalComplete              //通常終了

         //多重起動用の定数が設定されていない
                ,ecNotSetMainFormClassName     

         //既にアプリケーションが起動している
                ,ecApplicarionAlreadyRunning   


         //これを最後にもってくる(エラーメッセージは不要)
               ,ecLastMessage                 
                );



const
  //(システムエラーメッセージ)
  _SysErr:array[1..Ord(ecLastMessage)-1] of string =
           ('メインフォームクラス名が設定されていません'
           ,'既にアプリケーションが起動されています'
           );

もうちょっと良い設定方法があると思うんですけど、
今の自分にはこれが精一杯。

こんな感じです。

ではでは。
Norimakiでした。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする