Как предотвратить повторный запуск одной и той же программы ?
Думаю это делается через Event, но уровень познания Borland C++ пока что не даёт мне осуществить это в жизнь :)
это делается через API... есть два варианта - либо ищещь свое окно в системе по заголовку или имени класса окна (FindWindow), либо юзаешь мутексы (CreateMutex), второе по-моему, предпочтительнее...
зато первое гораздо проще
сразу после WinMain пишешь
HWND h = FindWindow("имя класса главного окна", "Заголовок главного окна");
if(h)
{
ShowWindow(h, SW_RESTORE);
SetForegroundWindow(h);
return 1;
}
зато первое гораздо проще
сразу после 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
Хотя если приложение небольшое и имеет окно, я думаю незачем занимать память лишним мутексом .
... Хотя наверное в билдеровских пиложениях это не принципиально ;-)
при некоректном завершении приложения
мютекс остается и единственный способ
удалить его это перезагрузка компьютера
так что приложение должно быть предельно безглючным
в использовании мютексов есть один нюанс
при некоректном завершении приложения
мютекс остается и единственный способ
удалить его это перезагрузка компьютера
так что приложение должно быть предельно безглючным
Если ты пишешь приложение работающее с БД то это даже плюс...
дело в том что если твое приложение повисло и оно могло не освободить занятые им таблицы баз данных... представь что может натворить приложение если к части баз и файлов будет иметь доступ а к другим нет ?
Очень советую при зависании таких программ перезагружать компьютер...
И даже можно используя эту фишку реализовать красивый вариант , использовать оба способа обнаружения запущенности программы и поиск окна и мутекс... если мутекс найден а окно нет значит в этом случае программа до этого запускалась и повисла... можно предложить пользователю перезагрузить компьютер или провести переиндексацию БД...
И правда удобно!
Хотя если приложение небольшое и имеет окно, я думаю незачем занимать память лишним мутексом .
... Хотя наверное в билдеровских пиложениях это не принципиально ;-)
А если приложение свёрнуто в SystemTray отловит ли его FindWindow(...)?
А если приложение свёрнуто в SystemTray отловит ли его FindWindow(...)?
SystemTray тут ни при чем, как было сказано выше - приложение либо имеет окно, и тогда оно будет найдено, либо не имеет окна - и тогда его нельзя найти по FindWindow, но оно все равно может создавать иконку в трее. А когда оконное приложение сворачивается в трей, то оно обычно делает ShowWindow(..., SW_HIDE) а окно все равно остается