FoxPro Club Главная

Конференция Решения Фотоальбом Сайт М.Дроздова Статьи Файловый архив Книга Visual FoxPro 9.0 Русский Help для Visual FoxPro
Пользователей: 9115
Вход
Запущен ли экземпляр приложения

Определение запущеного экземпляра приложения с использованием именованного объекта ядра. (WINDOWS NT/200/XP)


 
Прислал: Vit   Категория: Foxpro и другие приложения


Запущен ли экземпляр приложения

Здесь в решениях, уже описывались разные способы определения - запущен ли экземпляр приложения.
Каждый из них имеет свои достоинства и недостатки.
Способ, основанный на поиске окна, не годиться для приложений, где название окна меняется динамически.
Способ, основанный на блокировке таблицы, может требовать наличие дополнительной таблицы.
Предлагаю Вашему вниманию еще один способ, основанный на именованных объектах ядра 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.


 
Сделайте оценку этого решения Плохо Удовлетворительно Так себе Хорошо Отлично Текущая оценка: (4.904)
Дополнения пользователей
Запущен ли экземпляр приложения
[+][?]
oleg_km
22.04.05 08:53:15

>>Недостаток этого способа заключается в том, что в WINDOWS 
>>95/98/ME именованные объекты ядра не реализованы, его 
>>использование возможно только в NT/2000/XP. 

Мягко говоря - неверно
См. MSDN:
CreateMutex
The CreateMutex function creates a named or unnamed mutex object. 

HANDLE CreateMutex(
  LPSECURITY_ATTRIBUTES lpMutexAttributes,
                       // pointer to security attributes
  BOOL bInitialOwner,  // flag for initial ownership
  LPCTSTR lpName       // pointer to mutex-object name
);

...

QuickInfo
  Windows NT: Requires version 3.1 or later.
  Windows: Requires Windows 95 or later.
  Windows CE: Requires version 1.0 or later.
  Header: Declared in winbase.h.
  Import Library: Use kernel32.lib.
  Unicode: Implemented as Unicode and ANSI versions on Windows NT.

Так что все работает и в Win9x
Влад Колосов
18.05.07 16:00:37

>>Перед окончанием программы необходимо закрыть объект ядра 

>>= CloseHandle(hMutex)

Мьютекс тем и хорош, что он автоматически удаляется вместе с закрытием потока. Т.е.
CloseHandle(hMutex) категорически нельзя делать. Кроме того, можно запустить несколько экземпляров
программы с объявленным именем мьютекса, но OpenMutex() даст положительный результат до тех пор,
пока не закрыт последний экзеспляр. Это очень пролезно при загрузке обновлений версии, например.

[Дополнить]



© 2000-2017 Fox Club 
При размещении любых материалов с сайта на других ресурсах- прямая ссылка на www.foxclub.ru обязательна
Яндекс.Метрика