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

Clarion, Clarion 7

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

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

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

Сообщение eugene_fr » 26 Июнь 2019, 16:15

Приветствую всех знатоков 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
✯ Ветеран ✯
Сообщения: 3412
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

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

Сообщение kreator » 26 Июнь 2019, 16:45

Есть шаблон "Add functionality to the Frame". Там есть нужная опция. Добавьте его к фрейму и будет Вам счастье.
We are hard at work… for you. :)

Аватара пользователя
RaFaeL
Ветеран
Сообщения: 883
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

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

Сообщение RaFaeL » 26 Июнь 2019, 17:06

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

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

SetForegroundWindow(UNSIGNED),BOOL,PASCAL

Yufil
Ветеран движения
Сообщения: 1151
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

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

Сообщение Yufil » 26 Июнь 2019, 18:54

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

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

Сообщение Constantine » 27 Июнь 2019, 8:25

Можно еще проще: при запуске проверять наличие атома в 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
Ветеран движения
Сообщения: 1151
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

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

Сообщение Yufil » 27 Июнь 2019, 9:02

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

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

Но главный плюс в том, что работа с DDE изначально встроена в сам Кларион, можно передавать данные и сообщения другим копиям программы.

Constantine
Активист
Сообщения: 145
Зарегистрирован: 07 Февраль 2017, 16:58

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

Сообщение Constantine » 27 Июнь 2019, 9:30

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

Yufil
Ветеран движения
Сообщения: 1151
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

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

Сообщение Yufil » 27 Июнь 2019, 10:11

Ну, устроить обмен между приложениями по DDE гораздо проще, чем другим способом. Народ будет очень рад, если DDE отключат :)
https://www.securitylab.ru/news/490291.php

Аватара пользователя
RaFaeL
Ветеран
Сообщения: 883
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

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

Сообщение RaFaeL » 27 Июнь 2019, 10:30

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

Constantine
Активист
Сообщения: 145
Зарегистрирован: 07 Февраль 2017, 16:58

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

Сообщение Constantine » 27 Июнь 2019, 10:31

Да, останется. Пропадет только после перезагрузки.

eugene_fr
Прохожий
Сообщения: 2
Зарегистрирован: 26 Июнь 2019, 14:00

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

Сообщение eugene_fr » 27 Июнь 2019, 14:28

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

Ответить