Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как не допустить запуск второй копии программы 11

Delphi , Программа и Интерфейс , Приложение своё

Как не допустить запуск второй копии программы 11

Автор: Роман Василенко
WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Запуск одной копии приложения (Mutex-базированный)

Единственная функция Init_Mutex этого модуля (only_one.pas) создает мьютекс
с именем, переданным в параметре mid.
Возврат: true, если мьютекс создан (запущен первый экземпляр приложения)
или false, если уже имеется мьютекс с подобным именем (mid).

Особенности:
1. даже при "гибели" приложения все, относящиеся к нему мьютексы удаляются
с большой степенью вероятности.
2. Желательно "отметить" приложение в системе так, как указано в примере.
При таком подходе Ваше приложение почти со стапроцентной вероятностью
не будет запущено два раза.

Зависимости: Windows
Автор:       Роман Василенко, romix@nm.ru, Пятигорск
Copyright:   Роман Василенко
Дата:        14 июня 2002 г.
***************************************************** }

unit Only_One;

interface

function Init_Mutex(mid: string): boolean;

implementation

uses Windows;

var
  mut: thandle;

function mut_id(s: string): string;
var
  f: integer;
begin
  result := s;
  for f := 1 to length(s) do
    if result[f] = '\' then
      result[f] := '_';
end;

function Init_Mutex(mid: string): boolean;
begin
  Mut := CreateMutex(nil, false, pchar(mut_id(mid)));
  Result := not ((Mut = 0) or (GetLastError = ERROR_ALREADY_EXISTS));
end;

initialization
  mut := 0;
finalization
  if mut <> 0 then
    CloseHandle(mut);
end.

Пример использования:

program MyProgram;

uses
  only_one,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {dm: TDataModule},
  Unit3 in 'Unit3.pas' {Form3},

{$R *.RES}

const
  UniqueString = 'MyProgramMutex';
    {Может быть любое слово. Желательно латинскими буквами.}

  begin
    if not init_mutex(UniqueString) then
      exit; {Выходим до инициализации, если мьютекс уже есть}
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.CreateForm(Tdm, dm);
    Application.CreateForm(TForm3, Form3);
    Application.Run;
  end.

Программный код на Delphi демонстрирует способ предотвращения одновременного запуска нескольких экземпляров приложения. Он использует мьютекс (сокращение от "mutual exclusion", или взаимное исключение) для обеспечения того, что только один экземпляр программы может работать в то же время.

Вот шаг за шагом, как это работает:

  1. Единица Only_One содержит функцию Init_Mutex, которая создает мьютекс с указанным именем (mid). Если мьютекс уже существует, функция возвращает false, что означает, что другой экземпляр приложения уже запущен.
  2. В программе MyProgram функцию Init_Mutex вызывается с уникальной строкой (UniqueString) как аргументом. Если функция возвращает false, программа немедленно заканчивает работу, предотвращая одновременный запуск нескольких экземпляров.

Код также включает некоторые дополнительные функции:

  • Функция mut_id используется для преобразования имени мьютекса в имя API Windows, заменяя обратные слэши (\) на подчерки (_). Это необходимо потому, что имена API Windows не могут содержать обратные слэши.
  • Секции initialization и finalization используются для инициализации и очистки handles мьютекса соответственно. Это обеспечивает создание и освобождение мьютекса при завершении программы.

Эта APPROACH имеет некоторые преимущества:

  • даже если программа крушится или прерывается неожиданно, мьютекс будет автоматически освобожден.
  • программа может оставить "маркер" в системном реестре, указывая, что она запущена, что уменьшает вероятность запуска другого экземпляра.

Однако есть и некоторые потенциальные проблемы:

  • если несколько экземпляров программы запускаются одновременно, первый из них, который завершит свою инициализацию, может все еще работать успешно, в то время как другие блокируются мьютексом.
  • программа зависит от API Windows для управления мьютексом, что означает, что она не переносима на другие операционные системы.

В целом, этот код-снippet предоставляет основной механизм для предотвращения одновременного запуска нескольких экземпляров приложения в Windows.

В статье описана функция Init_Mutex, которая позволяет создать мьютекс с уникальным именем при запуске программы и предотвратить запуск второй копии программы на одном компьютере.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Приложение своё ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:38:33/0.0057811737060547/1