Учись программированию на C++ Builder бесплатно!
  • Главная
  • FAQ
  • Как запретить повторный запуск программы?

Рассмотрим два способа запрета повторного запуска программы.

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);
}

Поиск по сайту