Как обеспечить запуск только одного экземпляра моего приложения?
Есть ли поддержка в Delphi XE VCL для обеспечения работы только одного экземпляра приложения?
Раньше я использовал библиотечный код для управления Mutex, который всегда казался сложным. Когда я начинаю новый проект в Delphi XE, мне интересно, нужно ли мне перекопать этот старый код или уже есть поддержка, встроенная в XE? Или есть еще один простой в применении код, который хорош и современен?
- Как запустить программу командной строки в Delphi?
- Библиотека Delphi JSON для XE2, доступная для сериализации объектов
- Диктофон
- Инструменты анализа профилировщика и памяти для Delphi
- Переменные delphi инициализируются значением по умолчанию?
- Какая библиотека регистрации лучше?
- Преобразование строки в TDateTime на основе произвольного формата
- Как изменить реализацию (обход) функции, объявленной извне
- Как я должен подготовить свои 32-разрядные программы Delphi для возможного 64-битного компилятора?
- Как отсортировать общий список с помощью пользовательского сопоставления?
- Почему я получаю ошибку типа «type not typeinfo» с типом enums
- Как получить доступ к приватным методам без помощников?
- Как определить версию приложения в одном месте для нескольких приложений?
Я использую JCL для этого:
program MyProgram; uses JclAppInst; begin JclAppInstances.CheckSingleInstance; // Added instance checking Application.Initialize; Application.CreateForm(TMainForm, MainForm); Application.Run; end.
Документация для этого и схема уведомлений приведены в Wiki Wiki .
Вы создаете именованный 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 автоматически освободит дескриптор, когда наше приложение будет прекращено, и это абсолютно нормально с нами.