C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как не допустить запуска второй копии программы  (Прочитано 22463 раз)
oxotnik
Глобальный модератор


Сказали спасибо: +100/-15
Offline

Сообщений: 2425


Как не допустить запуска второй копии программы
« : 15 Январь 2008, 15:02:12 »

Код
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
 CreateMutex ( NULL, false, ExtractFileName(Application->ExeName).c_str());
 if ( GetLastError () == ERROR_ALREADY_EXISTS )
    {
      MessageDlg("Запущена вторая копия!!!", mtError, TMsgDlgButtons() mbAbort, 0);
      return ( 0 );
   }
       try
       {
                Application->Initialize();
                Application->Title = Application->ExeName;
                Application->CreateForm(__classid(TForm1), &Form1);
                Application->Run();
       }
...
...
...
 return 0;
}
 
Записан
Rius
Давний друг


Сказали спасибо: +116/-5
Offline

Сообщений: 753


Re: Как не допустить запуска второй копии программы
« Ответ #1 : 15 Январь 2008, 15:19:45 »

переименовываем exe и всё запускается
Guid например надо.
Записан
Rius
Давний друг


Сказали спасибо: +116/-5
Offline

Сообщений: 753


Re: Как не допустить запуска второй копии программы
« Ответ #2 : 15 Январь 2008, 17:22:04 »

что тут дописывать-то... одну строчку изменить...
Код
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
 CreateMutex ( NULL, false, "{F1B6EDDD-08C8-461b-A323-7DB8A1A70B64}");
 if ( GetLastError () == ERROR_ALREADY_EXISTS )
    {
      MessageDlg("Запущена вторая копия!!!", mtError, TMsgDlgButtons() mbAbort, 0);
      return ( 0 );
   }
       try
       {
                Application->Initialize();
                Application->Title = Application->ExeName;
                Application->CreateForm(__classid(TForm1), &Form1);
                Application->Run();
       }
...
...
...
 return 0;
}
Записан
Sullen
Участник


Сказали спасибо: +0/-1
Offline

Сообщений: 51


Re: Как не допустить запуска второй копии программы
« Ответ #3 : 22 Март 2008, 18:03:04 »

Цитата: Rius от 15 Январь 2008, 15:19:45
переименовываем exe и всё запускается
Guid например надо.
Mutex необходимо, что-бы имел определённое имя, например:
CreateMutex ( NULL,true,"Program_Is_Secretar");// к примеру
Записан
Tramp
Участник


Сказали спасибо: +3/-1
Offline

Сообщений: 17


Re: Как не допустить запуска второй копии программы
« Ответ #4 : 16 Апрель 2008, 13:00:29 »

А не нужно делать ?
Код
CloseHandle(hMutex);//по завершению программы удалили мьютекс 
 
Записан
olegenty
Администратор


Сказали спасибо: +16/-7
Offline

Сообщений: 520


« Ответ #5 : 20 Декабрь 2010, 22:39:50 »

Код
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
   HANDLE hMutex = 0;
   try
   {
       hMutex = CreateMutex(NULL, TRUE, gc_szAppMutex); // gc_szAppMutex - это и есть GUID
       if (GetLastError() == ERROR_ALREADY_EXISTS)
       {
           HWND h = FindWindow("TApplication", gc_szAppName); // gc_szAppName - а это имя главного окна для поиска и приподнятия
           if (h)
           {
               ShowWindow(h, SW_RESTORE);
               SetForegroundWindow(h);
           }
           return 0;
       }
       try
       {
           auto_ptrTfmSplash> f = auto_ptrTfmSplash>(new TfmSplash(NULL));
           f->Show();
           f->Update();
 
           TDateTime dtStart = TDateTime::CurrentDateTime();
 
           Application->Initialize();
           Application->Title = gc_szAppName; // Тут инициализируем наименование главного окна, что уже упоминалось выше
           Application->CreateForm(__classid(Tfm), &fm);
           Application->CreateForm(__classid(Tfmi), &fmi);
           TDateTime dtNow = TDateTime::CurrentDateTime();
           while (MilliSecondsBetween(dtStart, dtNow) 3000)
           {
               Application->ProcessMessages();
               Sleep(100);
               dtNow = TDateTime::CurrentDateTime();
           }
           f->Hide();
           SendMessage(fm->Handle, CM_INIT_COMPLETE, 0, 0);
           Application->Run();
       }
       catch (Exception &exception)
       {
            Application->ShowException(&exception);
       }
       catch (...)
       {
           try
           {
               throw Exception("");
           }
           catch (Exception &exception)
           {
               Application->ShowException(&exception);
           }
       }
   } __finally
   {
       if (hMutex) CloseHandle(hMutex); // А вдруг?
   }
   return 0;
}
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.074 секунд. Запросов: 20.