Как обеспечить запуск только одного экземпляра моего приложения? - PullRequest
25 голосов
/ 22 марта 2011

Есть ли в Delphi XE VCL поддержка для обеспечения работы только одного экземпляра приложения?

В прошлом я использовал библиотечный код для управления Mutex, который всегда казался сложным.Когда я начинаю новый проект в Delphi XE, мне интересно, нужно ли мне выкопать этот старый код или уже есть поддержка, встроенная в XE?Или есть другой простой в применении код, который хорош и современен?

Ответы [ 2 ]

35 голосов
/ 22 марта 2011

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

Поместите этот код сразу после «начала» в вашем файле DPR. Замените GUID на свой собственный. Когда мне нужна текстовая константа, которая вряд ли будет использоваться для чего-то еще, я обычно просто нажимаю Ctrl + G , чтобы получить GUID!

if CreateMutex(nil, True, '6EACD0BF-F3E0-44D9-91E7-47467B5A2B6A') = 0 then
  RaiseLastOSError;

if GetLastError = ERROR_ALREADY_EXISTS then
  Exit;

Может показаться, что код пропускает дескриптор, потому что он не сохраняет возвращаемое значение CreateMutex. Это не. Windows автоматически освободит дескриптор, когда наше приложение будет закрыто, и это нас устраивает.

24 голосов
/ 22 марта 2011

Я использую JCL для этого:

program MyProgram;

uses
  JclAppInst;

begin
  JclAppInstances.CheckSingleInstance; // Added instance checking
  Application.Initialize;
  Application.CreateForm(TMainForm, MainForm);
  Application.Run;
end.

Документация для этого и схема уведомлений находятся на в JCL Wiki .

...