Запущен ли экземпляр приложения
Здесь в решениях, уже описывались разные способы определения - запущен ли экземпляр приложения.
Каждый из них имеет свои достоинства и недостатки.
Способ, основанный на поиске окна, не годиться для приложений, где название окна меняется динамически.
Способ, основанный на блокировке таблицы, может требовать наличие дополнительной таблицы.
Предлагаю Вашему вниманию еще один способ, основанный на именованных объектах ядра WINDOWS.
Приведенный ниже фрагмент кода необходимо вносить в начало главной программы проекта.
#Define ERROR_ALREDY_EXIST 183
#Define MUTEX_NAME "{F93A88FF-2FEC-4f8f-8347-5B53D3E143F5}"
Declare integer CreateMutex in kernel32 integer lpMutexAttributes, ;
integer bInitialOwner, string lpName
Declare integer CloseHandle in kernel32 integer hObject
Declare integer GetLastError in kernel32
* Открываем объект ядра (в данном случае мьютекс)
hMutex = CreateMutex(0, 0, MUTEX_NAME)
* Проверяем существует ли объект с этим именем
if GetLastError() = ERROR_ALREDY_EXIST
* если существует закрываем экземпляр приложения
= messagebox("Application already run", 16)
= CloseHandle(hMutex)
Quit
endif
* Если не существует
* Далее продолжение программы
*...
Перед окончанием программы необходимо закрыть объект ядра
= CloseHandle(hMutex)
Поскольку именованные объекты ядра независимо от типа, имеют общее пространство имен, во избежании неприятностей при совпадении имени вашего объекта с уже существующими в системе или создаваемыми другими приложениями в будущем, необходимо тщательно подходить к выбору имени объекта.
В данном примере в качестве имени используется сгенерированный GUID (глобально уникальный идентификатор).
Использование GUID не обязательно, но важно обеспечить уникальность имени.
Недостаток этого способа заключается в том, что в WINDOWS 95/98/ME именованные объекты ядра не реализованы, его использование возможно только в NT/2000/XP.