мысли: запрет повторного запуска программы

Clarion, Clarion 7

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Гость

Сообщение Гость »

Привет Всем !

Помнится в Clare при компиляции 16-разрядного.приложения при повторном запуске одного и того же exe-шника собранной программы автоматически определялось окно уже ранее запущенной и восстанавливался фокус. В 32-х этого нет и приходится такие вещи делать вручную.

Я использую ф-ю API FindWindow

Код: Выделить всё

    FrameTitle = 'Моя программа'
    OtherPgmHwnd=FindWindow( ,FrameTitle)
 
   IF OtherPgmHwnd THEN       !окно отыскано
   ...
   ...
            ля-ля-я и выход
   ...
 
End !if

Однако если MDI, то описание окна-то изменяется, например: 'Моя программа [Окно такое-то]'

и FindWindow его уже не находит да и SUB не используешь

Можно, конечно создать в TEMP-овской Windows директории какой нибудь файл с эксклюзивным доступом и при старте его тоже пытаться открыть эксклюзивно, если ErrorCode(), то уже наверное приложение запущено....
однако, наверное, способ не самый оптимальный...

Хотелось бы узнать мнение Уважаемого Clalist-сообщества, кто как решает этот вопрос

Спасибо

Сергей
Сочи

(Добавление)

Hi,

Через mutex-ы. См. ABCFree
#EXTENSION(MiscOneApplicationInstance,'Misc: One application instance (only let app run once per system)'),APPLICATION
#!---------------------------------------------------------------------------------------------------------------------------------------------------------
#BOXED('One Application Instance')
#DISPLAY('Only one instance of your application will')
#DISPLAY('be allowed to run on a particular system')
Помнится в Clare при компиляции 16-разрядного.приложения при повторном запуске одного и того же exe-шника собранной программы автоматически определялось окно уже ранее запущенной и восстанавливался фокус.

И в 16 р можно запустить неск. экземпляров, если на NT ядре.

Nick Tsigouro <nick@arsis.ru>

Добрый день.
Я также делаю это через

Код: Выделить всё

CreateMutex(LONG lpMutexAttributes, !  ! pointer to security attributes
                     BYTE bInitialOwner,     !  ! flag for initial ownership
                     *CSTRING lpName         !  ! pointer to mutex-object name
                     ),LONG,PASCAL,RAW,NAME('CreateMutexA')
Проблем вроде не замечается, в том числе и при GPF.

С уважением, Марина
Написал: ClaList(2)
Гость

Сообщение Гость »

Возможен вариант с открытием приложением DDE-сервера. Запушенное приложение обращением DDEClient проверяет, был ли ранее стартован сервер

Код: Выделить всё

Server#=DDEClient('MyProgram','Started') 
If ~Server# 
    DDEServer('MyProgram','Started') 
Else  
   DDEPoke(Server#,'ЛЕОПОЛЬД','ВЫХОДИ') 
End 
А внутри цикла Access в головном окне принимать Event:DDEPoke и запускать что-то вроде

Код: Выделить всё

  Of Event:DDEPoke 
     0{Prop:Active}=True 
Разумеется, это не единственный вариант....

---------------------------------------
C уважением,
Юрий Философов,
Главный программист
Корпорация "Диполь", Саратов
E-mail yufil@tacis-dipol.ru (служ)
yufil@mail.ru (дом)
ICQ#75924439

Я испоьзую шаблон OnlyOne, основанный на DDE-технологии (в аттаче)

Alexander Polonskiy <pan@kw.ukrtel.net> (SUPS)

(Добавление)

Здравствуйте, Serg.

в С55 да и в С6

LibSrc\C55UTIL.CLW

см. BeginUnique

--
С уважением,
gottmituns mailto:gottmituns@mail.ru

У меня C55EE-H, нет там такого файла ни в LibSrc ни где еще...

--
С уважением,
Александр Юрьев mailto:sash@softmaster.ru
ICQ 59248879

Sorry, ошибочка вышла, есть файл :)

--
С уважением,
Александр Юрьев
Написал: ClaList(2)
Гость

Сообщение Гость »

Спасибо Всем откликнувшимся на эту тему !

Сергей
Сочи

p.s "То ни гроша, то вдруг алтын"
Написал: ClaList(2)
Гость

Сообщение Гость »

Предлагаю код функции, которую я использую.
Функция возвращает True если программа уже запущена и False
в противном случае.
Применять нужно после открытия APPLICATION.
IF CheckProcess() THEN RETURN.
Выход из программы и активным становится APPLICATION
уже запущенной программы.Если оно свернуто в иконку,
восстанавливает его.
Используется WinAPI.
Фунции
GetDesktopWindow(),UNSIGNED,PASCAL
GetWindow(LONG,UNSIGNED),LONG,PASCAL
GetWindowText(LONG,*CSTRING,SIGNED),SIGNED,PASCAL,RAW,NAME('GetWindowTextA')
IsIconic(HWND),BOOL,PASCAL
ShowWindow(HWND,SIGNED),BOOL,PASCAL
SetForegroundWindow(HWND),BOOL,PASCAL
Сообщения
GW_CHILD EQUATE(5)
GW_HWNDNEXT EQUATE(2)
SW_RESTORE EQUATE(9)

CheckProcess PROCEDURE
Count BYTE
MainWinHandle LONG
WinHandle LONG
TextLen SIGNED
WinText CSTRING(250)
AppName CSTRING(250)
WND LONG
CODE
AppName = TARGET{PROP:Text}
Count = 0
MainWinHandle = GetDesktopWindow()
WinHandle = GetWindow(MainWinHandle, GW_CHILD)
LOOP UNTIL WinHandle = 0
TextLen = GetWindowText(WinHandle, WinText, 200)
IF AppName = WinText
WND = WinHandle
IF Count = 1
MESSAGE('Программа уже запущена!')
IF IsIconic(WND) = True THEN I# = ShowWindow(WND, SW_RESTORE).
I# = SetForegroundWindow(WND)
RETURN(True)
END
Count += 1
END
WinHandle = GetWindow(WinHandle, GW_HWNDNEXT)
END
RETURN(False)
C уважением, Сергей Углик
Ответить