Рассмотрим два способа запрета повторного запуска программы.
1. Модификация файла Project1.cpp.
Чтобы при повторном запуске программы она не запускалась и выдавала сообщение, необходимо сделать некоторые изменения с файлом Project1.cpp. Открываем этот файл и находим следующий код:
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch(...)
{
try
{
throw Exception("");
}
catch(Exception &exception)
{
Application->ShowException(&exception);
}
}
return 0;
}
И заменяем его на этот:
#include <vcl.h>
#pragma hdrstop
USERES("Project1.res");
USEFORM("Unit1.cpp", Form1);
const char *NamedMutex= "OneOnly";
HANDLE CheckInstance(const char *Name)
{
HANDLE Mutex = CreateMutex(NULL, true,Name);
int er = GetLastError();
if(er) return 0;
return Mutex;
}
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
HANDLE Mutex = CheckInstance(NamedMutex);
if(!Mutex)
{
ShowMessage("Программа уже запущена!");
ReleaseMutex(Mutex);
return 1;
}
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
2. С помощью функции.
В конце файла Unit1.h перед #endif пропишем следующую функцию:
BOOL WeAreAlone(LPSTR szName)
{
HANDLE hMutex=CreateMutex(NULL, TRUE, szName);
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
CloseHandle(hMutex);
return false;
}
return true;
}
Теперь для формы CreatForm пропишем проверку условия на запуск программы:
if(WeAreAlone("Some_Unique_Name_Or_Other"));
else
{
ShowMessage("Программа уже запущена!");
exit(0);
}