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

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

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

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

Автор: Васильев Николай

Идет колдун по базару. Нос крючком, на голове колпак, сам в халате до пят звездами расшитом. Кругом фрукты, насекомые там над ними... Вдруг на нос ему садится оса. Колдун хлоп - и убил осу. Идет дальше. На нос ему садится еще одна оса. Опять хлоп - и нет осы. На нос садится третья. Тут колдуну надоело, достал он волшебную палочку и приказал:
- Хочу, чтобы осы сами по себе дохли без всякой видимой причины! Так появилась ОС 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 then
  begin
    Application.Initialize;
    with TForm1.Create(nil) do
    try
      Show;
      Update;
      Application.CreateForm(TMainForm, MainForm);
    finally
      Free;
    end;
    Application.Run;
  end
  else
    Application.MessageBox('Приложение уже запущено (возможно оно свернуто
      на панели задач): Нажмите кнопку ОК для продолжения работы',
      'Производственно-диспетчерская служба', MB_OK);
  CloseHandle(MemHnd);
end.

Программа на Delphi с чувством юмора!

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

Вот разбивка кода:

  1. Первая секция импортирует необходимые единицы и определяет два константы: MemFileSize (127) и MemFileName ('one_example').
  2. Секция var объявляет одиночную переменную MemHnd, которая является HWND (handle окна).
  3. Directive {$R *.RES} указывает компилятору включить все файлы ресурсов в проект.
  4. Блок begin определяет основной логик программы:
    • Создает файловое маппирование с помощью CreateFileMapping, с указанными параметрами. Это делается для создания уникального идентификатора для инстанции приложения.
    • Если создание файлового маппирования fails (т.е., код ошибки не равен ERROR_ALREADY_EXISTS), инициализирует приложение, создает форму (TForm1), отображает и обновляет ее, а затем запускает приложение с помощью Application.Run.
    • Если файловое маппирование уже существует (т.е., другая инстанция приложения запущена), отображает сообщение о предупреждении о существующей инстанции.
  5. Наконец, программа закрывает handle к файловому маппированию с помощью CloseHandle.

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

Альтернативным решением может быть использование встроенной функции Delphi под названием "Single Instance" или "Single Instance Application", которая позволяет указать, может ли приложение запускаться только один раз. Это можно достичь с помощью свойства Application.SingleInstance в сочетании с message pump и механизмом синхронизации (например, mutex). Этот подход более прост и легок для поддержки, чем создание файлового маппирования и проверка его существования.

Вот пример реализации этого альтернативного решения:

program pds;
uses
  Windows, Forms;

const
  SI_MUTEX_NAME = 'MyApplicationMutex';

begin
  Application.Initialize;
  if not Application.SingleInstance then
    Exit;

  // Ваши логика приложения здесь...
end.

В этом примере свойство SingleInstance установлено в True, что означает, что только одна инстанция приложения может запускаться одновременно. Если другая инстанция пытается запуститься, она будет немедленно остановлена. Константа SI_MUTEX_NAME указывает имя mutex, используемого для синхронизации.

В статье рассматривается способ предотвращения запуска второй копии программы на операционной системе Windows, путем использования функции CreateFileMapping и проверки результата GetLastError для определения существования уже открытого файла маппинга.


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

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




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


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


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 12:56:48/0.0034301280975342/0