いつもお世話になっています。
非常に不可解な現象に出くわしたので、皆さんのお知恵を借りたいと思います。
二重起動の防止にはMUTEXがよく使われますが
それを仕込んだのに二重起動してしまう状況が発生しています。
プロジェクトソースに
const
MUTEX_NAME = 'MUTEX_MYAPPLICATION';
var
hMutex: THandle;
begin
hMutex := CreateMutex(nil, True, MUTEX_NAME);
if WaitForSingleObject(hMutex, 0) = WAIT_TIMEOUT then
begin
MessageBox(Application.Handle, '既に起動しています',
'MyApplication', MB_OK);
CloseHandle(hMutex);
end
else
begin
try
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.Title := 'MyApplication';
Application.CreateForm(TDatabaseModule, DatabaseModule);
Application.CreateForm(TAppMainForm, AppMainForm);
Application.Run;
finally
CloseHandle(hMutex);
end;
end;
end.
このように記述しているのですが、TDatabaseModuleのOnCreateイベントで
同時に1プロセスしか開けないファイルを開くところでエラーになります。
(具体的にはFirebirdのEmbeded版でDBを開いています)
何らかの理由でTDatabaseModuleのOnCreateイベントが再度呼ばれたためとも考
えましたが
起動後にプロセスIDを取得しログに書き出してみると、明らかに違うIDが記録さ
れるので
確かに二重起動しているようです。
厄介なことに、開発マシンや手元にある別のPCでは全く再現せず、顧客先のPCで
のみ発生します。
その状況から環境に依存するものと思われますが
MUTEXが環境(や状況)によって効かない場合などあるのでしょうか?
このMUTEXの使い方が間違っているのでしょうか。
皆さんのお知恵をお貸しください。
Quest
MLホームページ:
http://www.freeml.com/delphi-users
----------------------------------------------------------------------
Powered by freeml --
http://www.freeml.com/ --
------------------------------------------------------[freeml byGMO]--