Идет колдун по базару. Нос крючком, на голове колпак, сам в халате до пят звездами расшитом. Кругом фрукты, насекомые там над ними... Вдруг на нос ему садится оса. Колдун хлоп - и убил осу. Идет дальше.
На нос ему садится еще одна оса. Опять хлоп - и нет осы.
На нос садится третья. Тут колдуну надоело, достал он волшебную палочку и приказал:
- Хочу, чтобы осы сами по себе дохли без всякой видимой причины!
Так появилась ОС Windоws 95...
program pds;
uses
Windows,
Forms,
Main in 'MAIN.PAS' {MainForm},
const
MemFileSize = 127;
MemFileName = 'one_example';
var
MemHnd: HWND;
{$R *.RES}begin
MemHnd := CreateFileMapping(HWND($FFFFFFFF), nil,
PAGE_READWRITE, 0, MemFileSize,
MemFileName);
if GetLastError <> ERROR_ALREADY_EXISTS thenbegin
Application.Initialize;
with TForm1.Create(nil) dotry
Show;
Update;
Application.CreateForm(TMainForm, MainForm);
finally
Free;
end;
Application.Run;
endelse
Application.MessageBox('Приложение уже запущено (возможно оно свернуто
на панели задач): Нажмите кнопку ОК для продолжения работы',
'Производственно-диспетчерская служба', MB_OK);
CloseHandle(MemHnd);
end.
Программа на Delphi с чувством юмора!
Программа предназначена для предотвращения запуска второй инстанции приложения, аналогично тому, как волшебник в вашей истории использует магию, чтобы убить пчел самостоятельно.
Вот разбивка кода:
Первая секция импортирует необходимые единицы и определяет два константы: MemFileSize (127) и MemFileName ('one_example').
Секция var объявляет одиночную переменную MemHnd, которая является HWND (handle окна).
Directive {$R *.RES} указывает компилятору включить все файлы ресурсов в проект.
Блок begin определяет основной логик программы:
Создает файловое маппирование с помощью CreateFileMapping, с указанными параметрами. Это делается для создания уникального идентификатора для инстанции приложения.
Если создание файлового маппирования fails (т.е., код ошибки не равен ERROR_ALREADY_EXISTS), инициализирует приложение, создает форму (TForm1), отображает и обновляет ее, а затем запускает приложение с помощью Application.Run.
Если файловое маппирование уже существует (т.е., другая инстанция приложения запущена), отображает сообщение о предупреждении о существующей инстанции.
Наконец, программа закрывает handle к файловому маппированию с помощью CloseHandle.
Цель этого кода - предотвратить одновременное запуск нескольких инстанций приложения, создавая уникальный идентификатор для каждой инстанции и проверяя его существование перед позволением другой инстанции запуститься.
Альтернативным решением может быть использование встроенной функции Delphi под названием "Single Instance" или "Single Instance Application", которая позволяет указать, может ли приложение запускаться только один раз. Это можно достичь с помощью свойства Application.SingleInstance в сочетании с message pump и механизмом синхронизации (например, mutex). Этот подход более прост и легок для поддержки, чем создание файлового маппирования и проверка его существования.
Вот пример реализации этого альтернативного решения:
В этом примере свойство SingleInstance установлено в True, что означает, что только одна инстанция приложения может запускаться одновременно. Если другая инстанция пытается запуститься, она будет немедленно остановлена. Константа SI_MUTEX_NAME указывает имя mutex, используемого для синхронизации.
В статье рассматривается способ предотвращения запуска второй копии программы на операционной системе Windows, путем использования функции CreateFileMapping и проверки результата GetLastError для определения существования уже открытого файла маппинга.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.