インストール先別に防止する

同一アプリケーションのインスタンスであってもインストール先が異なれば多重起動を許可したいという場合があります。それに対応するには、インストール先の間で異なる名前をミューテックスオブジェクトに付けるようにします。具体的には、インストール先のディレクトリパスから算出したハッシュ値をミューテックスの名前に追加するという方法が考えられます。例えば、次のようにします。
//---------------------------------------------------------------------------
// Project1.cpp
//---------------------------------------------------------------------------
namespace {
// 多重起動防止用ミューテックスの名前
// 注: CalculateSha256Hashは、この例のために設けた仮の関数
const AnsiString AppInstanceLockName =
        "ExampleAuthor.ExampleApplication.AppInstanceLock" +
        CalculateSha256Hash(AnsiUpperCaseFileName(ExtractFileDir(Application->ExeName)));
} // End of namespace
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
        try
        {
                // 多重起動を防止する
                ::SetLastError(NO_ERROR);
                HANDLE instanceLock = ::CreateMutex(NULL, true, AppInstanceLockName.c_str());
                if(instanceLock == NULL || ::GetLastError() != NO_ERROR) {
                        return 0;
                }

                Application->Initialize();
                Application->CreateForm(__classid(TForm1), &Form1);
                Application->Run();
        }
        catch (Exception &exception)
        {
                // ...
        }
        catch (...)
        {
                // ...
        }
        return 0;
}
//---------------------------------------------------------------------------
最終更新: 2008-11-10

戻る