Как обеспечить запуск только одного экземпляра моего приложения?
Есть ли поддержка в Delphi XE VCL для обеспечения работы только одного экземпляра приложения?
В прошлом я использовал библиотечный код для управления Mutex, который всегда казался сложным. Когда я начинаю новый проект в Delphi XE, мне интересно, нужно ли мне перекопать этот старый код или уже есть поддержка, встроенная в XE? Или есть другой удобный для использования код, который хорош и современен?
Ответы
Ответ 1
Я использую JCL для этого:
program MyProgram;
uses
JclAppInst;
begin
JclAppInstances.CheckSingleInstance; // Added instance checking
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.
Документация для этого и схема уведомлений находится в JCL Wiki.
Ответ 2
Вы создаете именованный Mutex при запуске приложения. Проверьте GetLastError
, чтобы узнать, запущен ли еще один экземпляр.
Поместите этот код сразу после "begin" в ваш 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 автоматически освободит дескриптор, когда наше приложение будет прекращено, и это абсолютно нормально с нами.