Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как предотвратить повторный запуск одной и той же программы ?

2.0K
03 января 2003 года
Roman
9 / / 10.11.2002
Может кто встречался с subj'евой проблемой ?
Думаю это делается через Event, но уровень познания Borland C++ пока что не даёт мне осуществить это в жизнь :)
317
04 января 2003 года
Relax
573 / / 20.09.2000
это делается через API... есть два варианта - либо ищещь свое окно в системе по заголовку или имени класса окна (FindWindow), либо юзаешь мутексы (CreateMutex), второе по-моему, предпочтительнее...
362
05 января 2003 года
_kolyan
339 / / 03.12.2002
Цитата:
Originally posted by Relax
это делается через API... есть два варианта - либо ищещь свое окно в системе по заголовку или имени класса окна (FindWindow), либо юзаешь мутексы (CreateMutex), второе по-моему, предпочтительнее...



зато первое гораздо проще
сразу после WinMain пишешь

HWND h = FindWindow("имя класса главного окна", "Заголовок главного окна");
if(h)
{
ShowWindow(h, SW_RESTORE);
SetForegroundWindow(h);
return 1;
}

3
05 января 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by _kolyan


зато первое гораздо проще
сразу после WinMain пишешь

HWND h = FindWindow("имя класса главного окна", "Заголовок главного окна");
if(h)
{
ShowWindow(h, SW_RESTORE);
SetForegroundWindow(h);
return 1;
}



А если окна нет? Еще нет... уже нет... или вообще нет и не будет... ? Или есть, но создано др. приложением?
Короче говоря, этот способ корявый!
А вот мьютекс самое то! И не сложнее:

#define MUTEX_NAME "Tra-la-la"

//Check if Mutex already exists
hMutex = OpenMutex( MUTEX_ALL_ACCESS, FALSE, MUTEX_NAME );

if(hMutex) return 0;

//It must not exist, so make Mutex
hMutex = CreateMutex( NULL, FALSE, MUTEX_NAME );

Главное задать уникальное имя MUTEX_NAME, но это, думаю, не сложно: "Mutex_for_my_application_I_Love_BEER"
:D

362
06 января 2003 года
_kolyan
339 / / 03.12.2002
И правда удобно!
Хотя если приложение небольшое и имеет окно, я думаю незачем занимать память лишним мутексом .
... Хотя наверное в билдеровских пиложениях это не принципиально ;-)
1.8K
10 января 2003 года
ALI
129 / / 10.01.2003
в использовании мютексов есть один нюанс
при некоректном завершении приложения
мютекс остается и единственный способ
удалить его это перезагрузка компьютера
так что приложение должно быть предельно безглючным
442
12 января 2003 года
HexoGenus
121 / / 20.03.2000
Цитата:
Originally posted by ALI
в использовании мютексов есть один нюанс
при некоректном завершении приложения
мютекс остается и единственный способ
удалить его это перезагрузка компьютера
так что приложение должно быть предельно безглючным



Если ты пишешь приложение работающее с БД то это даже плюс...
дело в том что если твое приложение повисло и оно могло не освободить занятые им таблицы баз данных... представь что может натворить приложение если к части баз и файлов будет иметь доступ а к другим нет ?

Очень советую при зависании таких программ перезагружать компьютер...
И даже можно используя эту фишку реализовать красивый вариант , использовать оба способа обнаружения запущенности программы и поиск окна и мутекс... если мутекс найден а окно нет значит в этом случае программа до этого запускалась и повисла... можно предложить пользователю перезагрузить компьютер или провести переиндексацию БД...

295
15 января 2003 года
gray_k
356 / / 20.12.1999
Цитата:
Originally posted by _kolyan
И правда удобно!
Хотя если приложение небольшое и имеет окно, я думаю незачем занимать память лишним мутексом .
... Хотя наверное в билдеровских пиложениях это не принципиально ;-)


А если приложение свёрнуто в SystemTray отловит ли его FindWindow(...)?

362
15 января 2003 года
_kolyan
339 / / 03.12.2002
Цитата:
Originally posted by gray_k

А если приложение свёрнуто в SystemTray отловит ли его FindWindow(...)?



SystemTray тут ни при чем, как было сказано выше - приложение либо имеет окно, и тогда оно будет найдено, либо не имеет окна - и тогда его нельзя найти по FindWindow, но оно все равно может создавать иконку в трее. А когда оконное приложение сворачивается в трей, то оно обычно делает ShowWindow(..., SW_HIDE) а окно все равно остается

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог