Как обеспечить запуск только одного экземпляра моего приложения?

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

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

Я использую 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 автоматически освободит дескриптор, когда наше приложение будет прекращено, и это абсолютно нормально с нами.

Interesting Posts

Как сериализовать объект в JSON?

Преобразование строки в GregorianCalendar

Имейте файл с именем ~ (tilde) в моем домашнем каталоге

Добавление раздела NTFS на диск в Windows делает раздел HFS + на том же диске невидимым в Mac OS X

Пользовательский интерфейс активности обновления Android от службы

cookie asp.net, аутентификация и тайм-ауты сеанса

Как я могу проверить работоспособность своего Samsung SSD?

Как компьютер загружается даже после отказа батареи CMOS?

ImageIO не удалось записать файл JPEG

Как настроить брандмауэр Windows 7 на запрос исходящего трафика?

Деление плавающей запятой в пакетном файле

Как я могу получить emacs под окнами для автозаполнения путей в буферах оболочки с помощью «\» вместо «/»?

Предварительный просмотр команд ZPL II с использованием .NET WinForm перед отправкой на принтер Zebra

Создание символической ссылки на подключенный сетевой диск в Windows

не удалось запустить COM-объект типа «microsoft.Office.Interop.Excel.ApplicationClass» в «microsoft.Office.Interop.Excel.Application»

Давайте будем гением компьютера.