Запрет повторного запуска приложения

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
eugene_fr
Прохожий
Сообщения: 2
Зарегистрирован: 26 Июнь 2019, 14:00

Запрет повторного запуска приложения

Сообщение eugene_fr »

Приветствую всех знатоков 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

В чем может быть проблема, помогите.
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Запрет повторного запуска приложения

Сообщение kreator »

Есть шаблон "Add functionality to the Frame". Там есть нужная опция. Добавьте его к фрейму и будет Вам счастье.
We are hard at work… for you. :)
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

Запрет повторного запуска приложения

Сообщение RaFaeL »

eugene_fr писал(а): 26 Июнь 2019, 16:15Однако потом при генерировании модуля выдает на SetForegroundWindow(LOC:ulOtherInstance) - unknown function label

В чем может быть проблема, помогите.
Не хватает описания SetForegroundWindow в MAP-секции

SetForegroundWindow(UNSIGNED),BOOL,PASCAL
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Запрет повторного запуска приложения

Сообщение Yufil »

Если ещё живёт 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 
Constantine
Активист
Сообщения: 185
Зарегистрирован: 07 Февраль 2017, 16:58

Запрет повторного запуска приложения

Сообщение Constantine »

Можно еще проще: при запуске проверять наличие атома в Global Atom Table. Если атома нет - программа не запущена. Если есть - вываливаемся. При закрытии - удаляем атом.
Преимущество в том, что 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)
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Запрет повторного запуска приложения

Сообщение Yufil »

Или можно взять мьютекс ( смотреть мануаль по Клариону )

Или ( если допустимо ) в определённом каталоге ( у меня каталогпрограммы\lock ) после запуска программы монопольно открыть файл и не закрывать. Не удалось открыть - значит, облом...

Но главный плюс в том, что работа с DDE изначально встроена в сам Кларион, можно передавать данные и сообщения другим копиям программы.
Constantine
Активист
Сообщения: 185
Зарегистрирован: 07 Февраль 2017, 16:58

Запрет повторного запуска приложения

Сообщение Constantine »

Yufil писал(а): 27 Июнь 2019, 9:02Но главный плюс в том, что работа с DDE изначально встроена в сам Кларион
Ага...
Только Майкрософт его уже лет 10 не поддерживает и не факт, что из следующей версии его вообще не выкинут... :-(
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Запрет повторного запуска приложения

Сообщение Yufil »

Ну, устроить обмен между приложениями по DDE гораздо проще, чем другим способом. Народ будет очень рад, если DDE отключат :)
https://www.securitylab.ru/news/490291.php
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

Запрет повторного запуска приложения

Сообщение RaFaeL »

Constantine писал(а): 27 Июнь 2019, 8:25Можно еще проще: при запуске проверять наличие атома в Global Atom Table. Если атома нет - программа не запущена. Если есть - вываливаемся. При закрытии - удаляем атом.
А если программа вылетела с ошибкой, он же там останется?
Constantine
Активист
Сообщения: 185
Зарегистрирован: 07 Февраль 2017, 16:58

Запрет повторного запуска приложения

Сообщение Constantine »

Да, останется. Пропадет только после перезагрузки.
eugene_fr
Прохожий
Сообщения: 2
Зарегистрирован: 26 Июнь 2019, 14:00

Запрет повторного запуска приложения

Сообщение eugene_fr »

Всем большое спасибо. Решил "добить" метод с которого начинал. Спасибо RaFaeL за помощь в устранение ошибки в описании MAP-секции. Все заработало.
Ответить