例えば、次のようにします。
//---------------------------------------------------------------------------
// Project1.cpp
//---------------------------------------------------------------------------
namespace {
//---------------------------------------------------------------------------
// 多重起動防止用ミューテックスの名前
const AnsiString AppInstanceLockName = "ExampleAuthor.ExampleApplication.AppInstanceLock";
// 最初のアプリケーションインスタンスに設定するプロパティの名前
const AnsiString AppInstanceMarkName = "ExampleAuthor.ExampleApplication.AppInstanceMark";
void __fastcall EnsureSingleAppInstance();
BOOL CALLBACK SetFirstAppInstanceForeground(HWND hwnd, LPARAM lParam);
//---------------------------------------------------------------------------
// 多重起動を防止する。もし既にインスタンスがあれば、それを最前面に置く。
void __fastcall EnsureSingleAppInstance()
{
::SetLastError(NO_ERROR);
HANDLE instanceLock = ::CreateMutex(NULL, true, AppInstanceLockName.c_str());
if(instanceLock == NULL || ::GetLastError() != NO_ERROR) {
::EnumWindows(reinterpret_cast<WNDENUMPROC>(SetAppFirstInstanceForeground), NULL);
Abort();
}
if(!::SetProp(Application->Handle, AppInstanceMarkName.c_str(), reinterpret_cast<HANDLE>(1))) {
Abort();
}
}
//---------------------------------------------------------------------------
// コールバック関数。多重起動防止後、最初のインスタンスを最前面に置く。lParam
// は使用しない。
BOOL CALLBACK SetFirstAppInstanceForeground(HWND hwnd, LPARAM lParam)
{
if(::GetProp(hwnd, AppInstanceMarkName.c_str()) != NULL) {
::SetForegroundWindow(hwnd);
}
return true;
}
//---------------------------------------------------------------------------
} // End of namespace
//---------------------------------------------------------------------------
// ...
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
EnsureSingleAppInstance();
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch(EAbort& e)
{
// Do nothing
}
catch (Exception &exception)
{
// ...
}
catch (...)
{
// ...
}
return 0;
}
//---------------------------------------------------------------------------