Запрет повторного запуска приложения
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Запрет повторного запуска приложения
Приветствую всех знатоков Clarion. Возможно такое уже обсуждали, но найти мне не удалось. Имеется приложение на CW6.3 ШВС. Как реализовать запрет повторного запуска приложения. Пользователи просто уже утомили, сворачиванием в трей и повторным запуском. Нашел на просторах инета вот такой пример (спасибо автору):
в MAP-секции:
MODULE('WinAPI')
GetDesktopWindow(),UNSIGNED,PASCAL
SetProp(UNSIGNED,*CSTRING,UNSIGNED),BOOL,RAW,PROC,PASCAL,NAME('SetPropA')
GetProp(UNSIGNED,*CSTRING),UNSIGNED,RAW,PASCAL,NAME('GetPropA')
RemoveProp(UNSIGNED,*CSTRING),UNSIGNED,RAW,PROC,PASCAL,NAME('RemovePropA')
END
В секции данных первой процедуры:
LOC:cstProgramID CSTRING('<какое-то уникальное описание нашей проги>')
LOC:ulOtherInstance ULONG,AUTO
Код инициализации процедуры:
! Проверка наличия программы в памяти для предотвращения повторной загрузки
! проверяем установленное свойство
LOC:ulOtherInstance = GetProp(GetDesktopWindow(),LOC:cstProgramID)
IF LOC:ulOtherInstance <> 0
! Проп заргистрирован - проверим существет ли окно
IF SetForegroundWindow(LOC:ulOtherInstance)
! Действительно наше окно уже загружено - просто выходим
DO ProcedureReturn
ELSE
! Окна нет - скорее всего прога пошло обвалилась - грузимся дальше
RemoveProp(GetDesktopWindow(),LOC:cstProgramID)
END
END
Код после открытия окна:
! Установка свойства для проверки наличия программы в памяти
SetProp(GetDesktopWindow(),LOC:cstProgramID,Метка окна{PROP:Handle})
Код перед закрытием окна:
! Удаляем установленный нами прор
RemoveProp(GetDesktopWindow(),LOC:cstProgramID)
Однако потом при генерировании модуля выдает на SetForegroundWindow(LOC:ulOtherInstance) - unknown function label
В чем может быть проблема, помогите.
в MAP-секции:
MODULE('WinAPI')
GetDesktopWindow(),UNSIGNED,PASCAL
SetProp(UNSIGNED,*CSTRING,UNSIGNED),BOOL,RAW,PROC,PASCAL,NAME('SetPropA')
GetProp(UNSIGNED,*CSTRING),UNSIGNED,RAW,PASCAL,NAME('GetPropA')
RemoveProp(UNSIGNED,*CSTRING),UNSIGNED,RAW,PROC,PASCAL,NAME('RemovePropA')
END
В секции данных первой процедуры:
LOC:cstProgramID CSTRING('<какое-то уникальное описание нашей проги>')
LOC:ulOtherInstance ULONG,AUTO
Код инициализации процедуры:
! Проверка наличия программы в памяти для предотвращения повторной загрузки
! проверяем установленное свойство
LOC:ulOtherInstance = GetProp(GetDesktopWindow(),LOC:cstProgramID)
IF LOC:ulOtherInstance <> 0
! Проп заргистрирован - проверим существет ли окно
IF SetForegroundWindow(LOC:ulOtherInstance)
! Действительно наше окно уже загружено - просто выходим
DO ProcedureReturn
ELSE
! Окна нет - скорее всего прога пошло обвалилась - грузимся дальше
RemoveProp(GetDesktopWindow(),LOC:cstProgramID)
END
END
Код после открытия окна:
! Установка свойства для проверки наличия программы в памяти
SetProp(GetDesktopWindow(),LOC:cstProgramID,Метка окна{PROP:Handle})
Код перед закрытием окна:
! Удаляем установленный нами прор
RemoveProp(GetDesktopWindow(),LOC:cstProgramID)
Однако потом при генерировании модуля выдает на SetForegroundWindow(LOC:ulOtherInstance) - unknown function label
В чем может быть проблема, помогите.
-
- ✯ Ветеран ✯
- Сообщения: 4994
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 7 раз
- Поблагодарили: 21 раз
Запрет повторного запуска приложения
Есть шаблон "Add functionality to the Frame". Там есть нужная опция. Добавьте его к фрейму и будет Вам счастье.
We are hard at work… for you.
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1378
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 7 раз
- Поблагодарили: 1 раз
- Контактная информация:
Запрет повторного запуска приложения
Не хватает описания SetForegroundWindow в MAP-секции
SetForegroundWindow(UNSIGNED),BOOL,PASCAL
Запрет повторного запуска приложения
Если ещё живёт DDE, то всё просто
Код: Выделить всё
! В начале приложения пытаемся получить клиента
Name="Моя программа"
Client# = DDEClient( Name )
!Если клиент получен - приложение уже запущено
IF Client#
! Отправляем по DDE сообщение
DDEWrite( .... )
! И остановимся
Halt(0)
ELSE
! Откроем свой сервер ...
Server# = DDEServer( Name )
! И поставить обработку Event:DDEWrire, если получили сообщение - разворачиваемся
... OF Event:DDEWrite
Post( Event:Maximized(, 1)
END
-
- Активист
- Сообщения: 185
- Зарегистрирован: 07 Февраль 2017, 16:58
Запрет повторного запуска приложения
Можно еще проще: при запуске проверять наличие атома в Global Atom Table. Если атома нет - программа не запущена. Если есть - вываливаемся. При закрытии - удаляем атом.
Преимущество в том, что GAT доступна любой программе, поэтому проверить можно откуда угодно.
Прототипы:
Преимущество в том, что GAT доступна любой программе, поэтому проверить можно откуда угодно.
Прототипы:
Код: Выделить всё
GlobalAddAtom(*CSTRING),ATOM,PASCAL,NAME('GlobalAddAtomA') !*LPCSTR
GlobalDeleteAtom(ATOM),ATOM,PASCAL
GlobalFindAtom(*CSTRING),ATOM,PASCAL,NAME('GlobalFindAtomA')
GlobalGetAtomName(ATOM,DWORD,DWORD),UNSIGNED,PASCAL,NAME('GlobalGetAtomNameA')
Код: Выделить всё
ATOM EQUATE(LONG)
Запрет повторного запуска приложения
Или можно взять мьютекс ( смотреть мануаль по Клариону )
Или ( если допустимо ) в определённом каталоге ( у меня каталогпрограммы\lock ) после запуска программы монопольно открыть файл и не закрывать. Не удалось открыть - значит, облом...
Но главный плюс в том, что работа с DDE изначально встроена в сам Кларион, можно передавать данные и сообщения другим копиям программы.
Или ( если допустимо ) в определённом каталоге ( у меня каталогпрограммы\lock ) после запуска программы монопольно открыть файл и не закрывать. Не удалось открыть - значит, облом...
Но главный плюс в том, что работа с DDE изначально встроена в сам Кларион, можно передавать данные и сообщения другим копиям программы.
-
- Активист
- Сообщения: 185
- Зарегистрирован: 07 Февраль 2017, 16:58
Запрет повторного запуска приложения
Ага...
Только Майкрософт его уже лет 10 не поддерживает и не факт, что из следующей версии его вообще не выкинут...
Запрет повторного запуска приложения
Ну, устроить обмен между приложениями по DDE гораздо проще, чем другим способом. Народ будет очень рад, если DDE отключат
https://www.securitylab.ru/news/490291.php
https://www.securitylab.ru/news/490291.php
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1378
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 7 раз
- Поблагодарили: 1 раз
- Контактная информация:
Запрет повторного запуска приложения
А если программа вылетела с ошибкой, он же там останется?Constantine писал(а): ↑27 Июнь 2019, 8:25Можно еще проще: при запуске проверять наличие атома в Global Atom Table. Если атома нет - программа не запущена. Если есть - вываливаемся. При закрытии - удаляем атом.
-
- Активист
- Сообщения: 185
- Зарегистрирован: 07 Февраль 2017, 16:58
Запрет повторного запуска приложения
Всем большое спасибо. Решил "добить" метод с которого начинал. Спасибо RaFaeL за помощь в устранение ошибки в описании MAP-секции. Все заработало.