ども、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でした。