#include <vcl.h>
#pragma hdrstop
USERES("Project1.res");
USEFORM("Main.cpp", Form1);
WINAPI WinMain(
HINSTANCE, HINSTANCE, LPSTR cmdLine, int)
{
try {
// попытка открыть Mutex
HANDLE hMutex = OpenMutex(
MUTEX_ALL_ACCESS, 0, "Mutex1.0");
if (!hMutex)//если прогр. запускается первый раз, то создаем Mutex
hMutex = CreateMutex(0, 0, "Project1.0");
else {
// если это вторая копия
// находим первую, ее на передний план
HWND hWnd = FindWindow(
0, "Project1.0");
SetForegroundWindow(hWnd);
// если передан параметр в ком. стр.
// пошлем первую копию на... через WM_COPYDATA.
if (strlen(cmdLine) != 0) {
COPYDATASTRUCT cds;
cds.cbData = strlen(cmdLine);
cds.lpData = cmdLine;
SendMessage(
hWnd, WM_COPYDATA, 0, (LPARAM)&cds);
}
//и завершаем работу второй копии...
return 0;
}
//здесь понеслась первая копия...
Application->Initialize();
Application->CreateForm(
__classid(TForm1), &Form1);
Application->Run();
ReleaseMutex(hMutex);
}
catch (Exception &exception) {
Application->ShowException(&exception);
}
return 0;
}
Какими путями можно предотвратить запуск второй копии программы на Win32-совместимой
Какими путями можно предотвратить запуск второй копии программы на Win32-совместимой ОС
Цитата:
Originally posted by VoldemarS
Какими путями можно предотвратить запуск второй копии программы на Win32-совместимой ОС
Какими путями можно предотвратить запуск второй копии программы на Win32-совместимой ОС
Созданием глобального именнованного объекта.
Например, мьютекса (см. CreateMutex)
Цитата:
Originally posted by VoldemarS
Какими путями можно предотвратить запуск второй копии программы на Win32-совместимой ОС
Какими путями можно предотвратить запуск второй копии программы на Win32-совместимой ОС
Код:
Имя Mutex-a лучше сгенерить как GUID (в редакторе BCB нажать Crtl+G), для поиска окна тоже самое + искать по имени класса, а не заголовка.
использование:
#include "sys_single.h"
const AnsiString guid = "My Cool Programm";// тут уникальный идентификатор программмы, можно получить нажав ctrl+shift+g в IDE;
...
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
single guard(guid);
guard.silient(); // без этого выводиться предупреждение что программа уже запущена
guard.change_title(); // менять заголовок программы (берется из Version Info)
if (!guard()) return 1; // проверка и выход если есть копия
...