Форум

Как запретить запуск одной проги несколько раз ?

Dima: Есть какая то функция в Xharbour ? PS Вроде был такой вопрос , но пока не найду........

Ответов - 34, стр: 1 2 All

fil: Checks if a given EXE is already running. Syntax: IsExeRunning( <cExeName> ) --> lRunning

Dima: Не вижу такой функции в xharbour...

fil: Нда ?! А где ты ее не видишь, я ее из харборовского хелпа и взял


Dima: В сырцах не вижу да и не собирается , в виду того что нет такой функции

fil: А, извиняюсь, это я по FWH 8.4 Но ты же вроде FWH и использовал

Dima: Нет не FWH , а чисто Xharbour реализация нужна.

fil: ну FindWindow() то в харборе небось есть, ну и найди по заголовку

gfilatov: fil пишет: IsExeRunning( <cExeName> ) --> lRunning HB_FUNC( ISEXERUNNING ) // ( cExeNameCaseSensitive ) --> lResult { HANDLE hMutex = CreateMutex( NULL, TRUE, (LPTSTR) hb_parc(1) ); hb_retl( GetLastError() == ERROR_ALREADY_EXISTS ); ReleaseMutex( hMutex ); }

Dima: gfilatov Спасибо !!!!!!!

Dima: gfilatov Русской доки не появилось случайно ? С ней было бы вопросов на много меньше у всех.

gfilatov: Dima пишет: Русской доки не появилось случайно ? Здесь требуется не дока по Харбору, а - по использованию WinAPI

Dima: gfilatov Где взять доку по WINAPI на русском ?

gustow: Я сейчас как раз занимаюсь переводом-оформлением MINIGUI.CHM (HMG ver.1.53 - но для 1.54, думаю, добавок-переделок будет немного). Сильно быстро ("вчера!") не гарантирую - но постараюсь побыстрее (самому нужно, чтобы не париться каждый раз с переводом "в мозгах"!)... Кто может посмотреть "на корректность перевода терминологии"? (например, "implicit" как "по-русски" перевести? "имплицитная"? не всякий - да и я "с устатку" - поймет...).

Петр: gustow пишет: например, "implicit" как "по-русски" перевести? "имплицитная"? лучше "неявная" выкладывайте - посмотрим

gustow: Бросил тройку страничек (заглавная, "Ваша первая программа" [как пример статьи] и "Action" [как пример описания команды]) - просто "на поглядеть-поругать-похвалить". Оно тут: http://upi-rock.narod.ru/MiniGUI_help/index.htm Комменты можно (кроме как сюда) и на < gustow33 at mail.ru >

Dima: gustow Что то нет там ни чего..

Петр: Dima пишет: Что то нет там ни чего.. Кнопка зеленая с стрелочкой - напротив "Всем привет"

Петр: gustow пишет: просто "на поглядеть-поругать-похвалить" Я бы определился с стилем написания - или это "для чайников" и тогда выражения типа - пусть она вякнет "Здравствуйте, люди добрые!"; 'Жамкни по мне - бибикну!' могут быть уместны (правда писать в таком стиле тоже уметь нужно ) или.. Ну, про PROCEDURE и RETURN говорить нечего (или вы никогда не программировали? ладно... Спрашивать у чайников о программировании, ну еще ладно.. это начало и конец процедуры Main - и в каждой (x)Harbour-программе должна быть процедура [и только одна!] c таким именем; с нее начинается выполнение всей программы It's not true. Т.е. не совсем правда. Как вы думаете, что будет выведено на консоль в результате выполнения этой программы --- start file --- PROCEDURE MyMain() ? "Hello from MyMain()" RETURN PROCEDURE _AppMain() ? "Hello from _AppMain()" RETURN PROCEDURE Main() ? "Hello from Main()" RETURN --- end file--- В моем понимании эта фраза - "выполняемое при клике мышью на контроле" должна была бы звучать как "выполняемое при щелчке мышью на элементе управления" @ 20, 20 LABEL L1 ; VALUE "Стереть всё нафиг" ; ACTION { || dal:=DeleteAllNafig(), ; iif( dal=.T., MsgInfo("Всё нафиг стёрто, мой господин!"), ; MsgInfo("Ни фига не стёрто, мой господин!") ) } Аккуратнее с примерами. Я понимаю, что примеры тоже надо уметь писать, но не забывайте, что на них учатся другие. @ 20, 20 LABEL L1 ; VALUE "Стереть всё нафиг" ; ACTION { || MsgInfo( iif( DeleteAllNafig(), "Всё нафиг стёрто, мой господин!", "Ни фига не стёрто, мой господин!" ) }

gustow: По стилю - понял... Буду строже (и ТОЧНО копировать примеры [без "самодеятельности"]). Устраивает ли "общий вид"? Нужны ли мои "добавки" - например, скриншоты получающегося в приведенном (в читаемой статье) примере? Насчет (правда писать в таком стиле тоже уметь нужно ) - конечно, не собираюсь писать "(x)Harbour+MiniGUI" для чайников" :) ... но судя по (достаточно большому) количеству вопросов, задаваемых в форуме, "гУрам" иногда приходится объяснять начинающим для них ("для "гур") _очевидное_ и _элементарное_ "на пальцах" (я без всякого наезда и на вас, Петр, и на остальных "более разбирающихся" - но припомните, _что_ иногда спрашивают!)... Хотелось бы, чтобы для "новичка" (перед которым стоит банальная задача: есть старая прога, сделанная на Клиппере; Клиппер я немного знаю, исходники есть [или EXEшка декомпилирована]; как из нее сделать что-то "современное" - с кнопочками, рюшечками и пр.? о! есть какой-то "харбор", к нему какая-то "мини-гуЯ"... ммммм... и как этим пользоваться [не особенно-то разбираясь и в самом-то Клиппере]???)... Пиша эти примерчики, ориентировался на уровень "познаний" теток-программерш из своей "минздравовской" конторы (где приходится поддерживать еще n-ное кол-во "древних" разработок, которые "писать с нуля" и некому и некогда): им - видя мои "пробы пера" с ГУЯми - и хочется, и колется (язык-то знакомый - только кой-чему "без особого напряга" подучиться; и будет она писать проги "прямо как на Вижал Се")... Да еще ориентировался на то, как объясняю "основы" своей 13-летней дочке - и она уже вполне "программит"!.. Конечно, это не аргументы для превращения _справочника_ в "цирк"... так что постараюсь быть "построже". В общем, кину на днях еще - и буду ждать "правок" (я не обижаюсь на _обоснованную_ критику - все-таки никакой я не "тех.пис."; но... что-то никто из "умеющих писать" почему-то до сих пор не "отважился" - что, кстати, скажется и на кол-ве желающих попользоваться МиниГУИ... да и Харбором как таковым [а зачем тогда Григорий со товарищи всё это "лудят"?? для пары-тройки гиков?]). Да! еще напоследок (опять же без желания "открывать дискуссию") - в приведенном Петром примере имеется три процедуры с РАЗНЫМИ именами... Петр, просто из теоретического интереса попробуйте в _одном_ .PRG создать _две_ функции MAIN() (именно с _одинаковыми_ - абсолютно - именами; и без всяких придумок - а просто)... Я, как ни старался, так и не смог скормить _такое_ компилятору (он, придурок, почему-то "ругался")... Но вдруг у вас получится? Кстати, Петр, спасибо (без стёба - большое!) за критику и поправки (насколько я понимаю - остальным либо влом, либо нафиг не интересно). И не перенести ли вопрос "о русской доке" в отдельную ветку? Товарищи! Еще раз подчеркиваю - я ЧАЙНИК!!! (во всяком случае, таковым себя считаю - поскольку знаю достаточно много программистов, по сравнению с которыми я действительно не знаю практически НИЧЕГО). Однако же достаточно много и таких, которые "завтра узнают то, что я уже давно забыл"... :)

Петр: gustow пишет: Нужны ли мои "добавки" - например, скриншоты Нужны, и примеры нужны. Справка MiniGUI уж очень спартанская. что-то никто из "умеющих писать" почему-то до сих пор не "отважился" - что, кстати, скажется и на кол-ве желающих попользоваться МиниГУИ... да и Харбором как таковым [а зачем тогда Григорий со товарищи всё это "лудят"?? Это к Григорию, особенно вторая часть вопроса. По первой позволю себе заметить, что грамотно написать документацию может не каждый программист. gustow пишет: Да! еще напоследок (опять же без желания "открывать дискуссию") - в приведенном Петром примере имеется три процедуры с РАЗНЫМИ именами... Петр, просто из теоретического интереса попробуйте Боюсь дискуссии не получится Да действительно обьявить две функции с одинаковыми именами (и не только Main) не получится. Но ведь я об этом и не говорил: если вы описываете Main - вы должны обязательно упомянуть _AppMain и ключ компилятора -n, хотя это к MiniGUI и никакого отношения не имеет.

gustow: Понял. Напишу, как получится. "Кто любит более тебя - напишет более меня" :)

MMK: gustow пишет: Понял. Напишу В связке харбор+FWH многие используют UEStudio По ссылке ниже пример описпния , как ее использовать. Может натолкнет на нвые мысли или чем поможет :)) http://www.atzwanger.com/FWHRAD/FWHRAD.html

Andrey: Dima пишет: Где взять доку по WINAPI на русском ? Могу выслать на ящик.

MMK: Andrey пишет: Могу выслать на ящик Благодарность не будет знать границ .... :)))) mkizev////mail.ru

Dima: Andrey пишет: Могу выслать на ящик Буду ждать тёрк-тёрк////тёрк.ru ;)

Andrey: Dima А кинь пожалуйста примером который ты сделал на чистом хХарборе !

Dima: Andrey пишет: А кинь пожалуйста примером который ты сделал на чистом хХарборе ! Примером чего Андрей ?

Andrey: Dima пишет: Примером чего Андрей ? Примером: "Как запретить запуск одной проги несколько раз ?" или ты его не сделал ?

Dima: Proc Main if isexerunning("test") ? "Прога уже запущена" quit endif return nil #pragma BEGINDUMP #include <windows.h> #include <hbapi.h> #include <shlobj.h> HB_FUNC( ISEXERUNNING ) // ( cExeNameCaseSensitive ) --> lResult { HANDLE hMutex = CreateMutex( NULL, TRUE, (LPTSTR) hb_parc(1) ); hb_retl( GetLastError() == ERROR_ALREADY_EXISTS ); ReleaseMutex( hMutex ); } #pragma ENDDUMP

Andrey: Спасибо Дима ! А как автоматически определять имя проги ? Если она будет не "test" ?

Dima: Andrey пишет: А как автоматически определять имя проги ? Если она будет не "test" ? Ну ты ведь знаешь заранее как ты обзовешь EXE шник ;) Хотя возможно есть такая функция в CT EXENAME()

Dima: Andrey По ходу в присланной тобой докуметации я так и не нашел функции CreateMutex()

Andrey: А что это за функция ? Что ты хочешь сделать ?

Andrey: Сделал прогу, только не могу поднять "запущенную ранее программу" ! Как получить "хендл" запущенной ранее программы ? =========================================================== #define MYPROGRAM " Программа проверки запуска ! " Procedure Main LOCAL nI:=0, nKey, hWnd := GetForegroundWindow() LOCAL cNameWin, cExeRun := SUBSTR(EXENAME(), RAT("\",EXENAME())+1 ) IF hb_gt_version() == "WVT" // Если используется граф.терминал GTWVT.LIB cNameWin := HB_OEMTOANSI( MYPROGRAM ) ELSE cNameWin := MYPROGRAM ENDIF GTInfo( 26, cNameWin ) SETCOLOR("15/2") CLEAR SCREEN ? "Номер окна:", hWnd ? "Имя ЕХЕ-файла: ", cExeRun if isexerunning(cExeRun) ALERT("Прога уже запущена !") // Как сделать переключение на ренее запущенную программу ? MAXIMIZE( hWnd ) // - не работает tone(400,2) quit endif DO WHILE .T. nKey := INKEY(1) IF nKey == 27 // K_ESC EXIT ENDIF @ 4,2 SAY "ESC-выход Режим ожидания:" ?? nI++ ENDDO return #pragma BEGINDUMP #include <windows.h> #include <hbapi.h> #include <shlobj.h> HB_FUNC( ISEXERUNNING ) // ( cExeNameCaseSensitive ) --> lResult HANDLE hMutex = CreateMutex( NULL, TRUE, (LPTSTR) hb_parc(1) ); hb_retl( GetLastError() == ERROR_ALREADY_EXISTS ); ReleaseMutex( hMutex ); HB_FUNC( GETFOREGROUNDWINDOW ) hb_retnl( (LONG) GetForegroundWindow() ); HB_FUNC( MINIMIZE ) ShowWindow( (HWND) hb_parnl(1), SW_MINIMIZE ); HB_FUNC( MAXIMIZE ) ShowWindow( (HWND) hb_parnl(1), SW_RESTORE ); #pragma ENDDUMP ==================================================



полная версия страницы