powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как сделать, чтобы приложение не запускалось второй раз
25 сообщений из 35, страница 1 из 2
Как сделать, чтобы приложение не запускалось второй раз
    #32757269
lin_i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Т.Е. если оно уже запущено (например свернуто окно, а пользователь его не видит, то просто развернуть его). Нужна очень эта "защита от дураков"
...
Рейтинг: 0 / 0
Как сделать, чтобы приложение не запускалось второй раз
    #32757274
alexFV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.sql.ru/forum/actualthread.aspx?tid=88788
...
Рейтинг: 0 / 0
Как сделать, чтобы приложение не запускалось второй раз
    #32758100
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да.. ?!
А если заголовок окна приложения меняется в самом приложении, например содержит имя пользователя, работающего в данный момент с приложением ?
С уважением, Алексей.
...
Рейтинг: 0 / 0
Как сделать, чтобы приложение не запускалось второй раз
    #32758109
Гость_xxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тебе поможет объект ядра мьютекс.
...
Рейтинг: 0 / 0
Как сделать, чтобы приложение не запускалось второй раз
    #32758371
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простейший вариант:

-) На стороне клиента создается свободный DBF (пустой, с одним полем)
-) При открытии приложения этот DBF открывается в режиме EXCLUSIVE
-) Если получили ошибку " File access is denied (Error 1705) " значит приложение уже открыто

Одновременно, этот файл может служить признаком корректного завершения приложения, если его удалять при закрытии приложения.

Т.е. если при входе в приложение файл уже существует и еще не открыт в режиме EXCLUSIVE, значит последнее завершение приложения было некорректно.
...
Рейтинг: 0 / 0
Как сделать, чтобы приложение не запускалось второй раз
    #32759127
Yura .
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариант с DBF хороший, я сам его использовал. Очень редко, но все-таки случались ситуации, когда с момента старта программы до открытия контрольного файла программа успевала все-таки загрузиться дважды, но в принципе работает. Отказался потому, что требовалось запускать программу реально несколько раз параллельно для работы с разными базами данных.
Использовал так-же вариант открытия контрольного окна, сейчас уже не помню почему, но и от него отказался.
Из всех вариантов на фоксе самые надежные результаты мне дал вариант, когда после старта программы выдается приглашение на ввод сегодняшнего числа (например). Программа может загрузиться несколько раз, но если пользователь не ввел дату в которой он хочет работать (разумеется для даты сегодня достаточно было нажать всего одну кнопку), то через одну минуту приложение не получив отклика юзера корректно закрывается. Разумеется сколько-бы раз программа не стартовала, ответ от юзера получит только одна сессия.
В насстоящее время кроме этого я использую специально написанный на VC+ MFC стартер с вариантом Mutex. Результат прекрасный.
...
Рейтинг: 0 / 0
Как сделать, чтобы приложение не запускалось второй раз
    #32759283
luser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чем такой подход не нравиться ?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
#define ERROR_ALREADY_EXISTS              183 
DECLARE integer CreateMutex IN WIN32API string @, integer, string @
DECLARE integer GetLastError IN Win32Api
DECLARE integer ReleaseMutex IN WIN32API integer

PUBLIC hMutex as Integer,lc_NameApp as String  
 
* Эта форма запущена  будет
 ofrm_test =  CREATEOBJECT("my_form")
 IF VARTYPE( ofrm_test) ="O" AND !ISNULL(ofrm_test)
 ofrm_test.Show( 1 )
 ENDIF
 
 * Эта форма запущена не будет
 ofrm_test1 =  CREATEOBJECT("my_form")
 IF VARTYPE( ofrm_test1) ="O" AND !ISNULL(ofrm_test1)
 ofrm_test1.Show( 1 )
 ENDIF
 

DEFINE CLASS  my_form as form 
lStart_on =.f.

PROCEDURE Init
lc_NameApp = "UnicNameApp" && Тут можешь к примеру писать имя своего APP
hMutex =  CreateMutex(null, 1 , @lc_NameApp)
IF hMutex =  0 
?  "Ошибка создания объекта ядра - мьютекс" 
ELSE
 IF GetLastError() == ERROR_ALREADY_EXISTS 
?  "Приложение уже запущено"        && При последующих запусках попадаем суда
  RETURN .F.
  ELSE
  lStart_on =.t.
  WAIT WINDOW "Создан новый мьтекс для контроля запуска"  nowait   && При  1  запуске
 endif
ENDIF
ENDPROC
PROCEDURE Destroy
IF this.lStart_on && Очистим мьютекс для  1  копии приложения
                  &&(чтобы можно было  еще раз запустить )
    ReleaseMutex(hMutex)
  endif  
EndProc
enddefine

Не все ошибки выполнения функций обработаны, но это уже дело вкуса.
...
Рейтинг: 0 / 0
Как сделать, чтобы приложение не запускалось второй раз
    #32759294
luser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Маленькая неточность, нужно вот так :
Код: plaintext
hMutex =  CreateMutex(null, 0 , @lc_NameApp) && Захватывать не надо
...
Рейтинг: 0 / 0
Как сделать, чтобы приложение не запускалось второй раз
    #32760017
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 luser

Надо соблюдать правила хорошего тона:

ReleaseMutex(hMutex) - в данном случае ни на что не влияет, поскольку синхронизация у тебя идет не через Wait функции
CloseHandle(hMutex) - а вот без этого под 98 у тебя может случится конфуз - вроде ты и вышел из приложения, а повторно зайти не можешь
...
Рейтинг: 0 / 0
Как сделать, чтобы приложение не запускалось второй раз
    #32760023
luser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cогласен. Даже не знаю, почему я написал Release, видимо о чем-то еще думал. Хорошее конструктивное замечание.
...
Рейтинг: 0 / 0
Как сделать, чтобы приложение не запускалось второй раз
    #32760820
oleg_km
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>> а вот без этого под 98 у тебя может случится конфуз

не понял, какой может быть конфуз. Mutant также убъется при выгрузке приложения, как и в другой Windows или я не прав
...
Рейтинг: 0 / 0
Как сделать, чтобы приложение не запускалось второй раз
    #32762552
Dushes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как вариант:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
* ___________________________
PARAMETERS cNAME_PROCESS

 #define TH32CS_SNAPPROCESS  2 
 #define MAX_PATH  260 
  DECLARE INTEGER CreateToolhelp32Snapshot IN WIN32API INTEGER,INTEGER 
  DECLARE SHORT   CloseHandle        IN WIN32API INTEGER
  DECLARE SHORT   Process32First     IN WIN32API INTEGER, STRING
  DECLARE SHORT   Process32Next      IN WIN32API INTEGER, STRING


  local proc,hSnap,str1,nCOUNT_OF_PROCESSES
  proc=space( 9 * 4 )+space(MAX_PATH)
 nCOUNT_OF_PROCESSES =  0 
  hSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,  0 )
  if isnull(hSnap) or hSnap= 0 
  	 MessageBox("Ошибка при создании снимка системы")
	 return
  endif
  if Process32First(hSnap, @proc)> 0 
	  str1=substr(proc, 9 * 4 + 1 , 260 )
	  str1=left(str1,iif(at(chr( 0 ),str1)> 0 ,at(chr( 0 ),str1)- 1 ,len(str1)))
	  ProcessID = substr(proc, 2 * 4 + 1 , 4 )
	  ProcessID = ( ((ASC(SUBST(ProcessID, 4 , 1 ))* 256 ) + ASC(SUBST(ProcessID, 3 , 1 )))* 256  + ASC(SUBST(ProcessID, 2 , 1 )))* 256  + ASC(LEFT(ProcessID, 1 ) )
	  IF  UPPER(ALLTRIM(cNAME_PROCESS))$UPPER(ALLTRIM(STR1))
	     nCOUNT_OF_PROCESSES = nCOUNT_OF_PROCESSES +  1 
	  ENDIF

	  do while Process32Next(hSnap, @proc) >  0 
	  str1=substr(proc, 9 * 4 + 1 , 260 )
	  str1=left(str1,iif(at(chr( 0 ),str1)> 0 ,at(chr( 0 ),str1)- 1 ,len(str1)))
	  ProcessID = substr(proc, 2 * 4 + 1 , 4 )
	  ProcessID = ( ((ASC(SUBST(ProcessID, 4 , 1 ))* 256 ) + ASC(SUBST(ProcessID, 3 , 1 )))* 256  + ASC(SUBST(ProcessID, 2 , 1 )))* 256  + ASC(LEFT(ProcessID, 1 ) )
  
		  IF  UPPER(ALLTRIM(cNAME_PROCESS))$UPPER(ALLTRIM(STR1))
		     nCOUNT_OF_PROCESSES = nCOUNT_OF_PROCESSES +  1 
		  ENDIF

	  enddo
  endif
  CloseHandle(hSnap)
  RETURN  nCOUNT_OF_PROCESSES
* ___________________________


Пример использования:
Код: plaintext
1.
2.
3.
IF FIND_PROCESS("REESTR.EXE")> 1 
      QUIT
ENDIF
С уважением
duШes
....return ThisForm.exGrid1.p_oColumns("COLUMN1").M_AddHeader("header4",4)
...
Рейтинг: 0 / 0
Как сделать, чтобы приложение не запускалось второй раз
    #32764185
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Dushes!

Угу, это понятно. Кстати имя процесса в системе - НЕ ЕСТЬ уникальный его
идентификатор. Тогда уж стоит вынимать и полный путь к модулю (учитывая
особенности для процессов запускаемых при Boot-инге системы в обращении к
элементам ФС). Мне тут почему-то вспомнился троян, маскировавшийся под
svchost.dll, и даже прописавшийся в %WINDIR% - тогда как "настойщий" svchost
обитает в %WINDIR%\system32.
Также не вполне очевидны особенности работы такого метода под Terminal
Services - но там вообще масса нюансов :)

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
Как сделать, чтобы приложение не запускалось второй раз
    #32764288
Dushes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет, Игорь.
Мое мнение таково что данный вариант всяко лучше чем отслеживать капшн окна приложения, к тому же как правило само приложение запускается из одного каталога (в пределах клиентской станции)...Если принять что имя процесса не есть уникальное название, ничто не мешает использовать AGETFILEVERSION для проверки компании, автора, номера версии и пр...
К тому же, получив хэндл приложения, используя API, не трудно определить стартовый каталог приложения....но это опять-таки особенности реализации;)...

С уважением
duШes
....return This.MultiColumnTreView.p_oNodes["key_node_13"].p_oSubItems[3].p_cText
...
Рейтинг: 0 / 0
Как сделать, чтобы приложение не запускалось второй раз
    #32764365
miv32
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Делается так:
Работает на 98/2000/XP

DECLARE INTEGER OpenEvent IN kernel32 AS oe ;
integer a, integer b, String c

DECLARE INTEGER CreateEvent IN kernel32 AS ce ;
integer b1,integer b2,integer b3, String c1

IF NOT EMPTY(oe(1,0,"666"))
MESSAGEBOX('Программа уже запущена!',16,'Ошибка')
QUIT
ENDIF
ce(0,0,1,"666")
...
Рейтинг: 0 / 0
Как сделать, чтобы приложение не запускалось второй раз
    #32764888
luser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А какая разница ? :)) Что мьтекс , что событие объекты ядра :))
...
Рейтинг: 0 / 0
Как сделать, чтобы приложение не запускалось второй раз
    #32764920
luser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда уж самый просто способ, до загурзки главного окна делать
Declare Integer FindWindow in Win32Api string @, string @
Код: plaintext
1.
2.
if FindWindow( 0 ,<MymainFom.caption>)= 0 
  Return .F.
 endif
И усе, чтоб не мучаться.
...
Рейтинг: 0 / 0
Как сделать, чтобы приложение не запускалось второй раз
    #32764926
luser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наоборт :
Код: plaintext
1.
2.
if FindWindow( 0 ,<MymainFom.caption>)!= 0 
    Return .F.
endif
...
Рейтинг: 0 / 0
Как сделать, чтобы приложение не запускалось второй раз
    #32765794
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi luser!

Нет, по заголовку искать - это плохо - заголовок может изменяться - причём
достаточно много ситуаций к этому ведут. Всё-же объекты ядра это значительно
надёжнее. А из них для этой цели лучше всего подходит именно Mutex.

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
Как сделать, чтобы приложение не запускалось второй раз
    #32765943
piva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://vfpdev.narod.ru/util_r.html
А там
к предотвращению повторного запуска приложения, если заголовок основного окна может меняться
http://vfpdev.narod.ru/download/multex.zip
...
Рейтинг: 0 / 0
Как сделать, чтобы приложение не запускалось второй раз
    #32766990
oleg_km
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>> А из них для этой цели лучше всего подходит именно Mutex.

А почему именно Mutex? В данной ситуации абсолютно все равно: Mutex, Event, Semaphore или кто еще чего знает. У них у всех общее свойство - уникальное в пределах системы имя (что вобщем-то есть у файлов) и автоматическое "удаление из системы" в случае краха процесса, который их создал (чего нет у файлов). То чем они отличаются, для данной задачи не имеет никакого значения.

Пишу только затем, чтобы люди не кинулись переделывать программы где используются не Mutex на Mutex
...
Рейтинг: 0 / 0
Как сделать, чтобы приложение не запускалось второй раз
    #32767007
kus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
kus
Гость
То oleg_km:
Подходит именно потому, что именно этих целей и предназначен, в отличии от всего другого. Вообщем потому что так "партия" приказала, если будет угодно ;)
...
Рейтинг: 0 / 0
Как сделать, чтобы приложение не запускалось второй раз
    #32767422
oleg_km
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>> Подходит именно потому, что именно этих целей и предназначен

Ну тогда чушь это. Если на то пошло, Mutex предназначен что бы его один процесс захватывал через WaitForSingleObject (например), а другой/другие процесс/ы ждал, используя ту же функцию, пока первый освободит этот Mutex, используя ReleaseMutex. Ну и где в данном случае используется хоть одна из этих функций? Данное использование объектов ядра вообще-то является, скажем так, трюком, побочным использованием свойств этих объектов. А Mutex не больше подходит для этих целей, просто в KB Microsoft именно Mutex использовала для примера, как предотвратить повторный запуск приложений, потому как использовавшийся ранее (в Win16) способ в Win32 перестал работать.
Я это все к тому, что если кто-то реализовал это через Event например, переделывать ничего не нужно, никакая "партия" ничего не приказывала. Просто задевает то, что мы все грамотные люди, принимаем только проверенные вещи, а в данном случае как-то это шаманством отдает. Короче, нет слов
...
Рейтинг: 0 / 0
Как сделать, чтобы приложение не запускалось второй раз
    #32767513
kus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
kus
Гость
Что ж ты неугомонный такой ? Амбициозный и неугомонный. Вам, сэр - прямая дорога в МSDN в раздел "сихронизация потоков и процессов".
Надеюсь по английски читаете свободно. А вот то что вы написало в прошлом посте точная чушь. Вообщем читайте, изучайте, пробуйте, потом амбиции Ваши будем обсудать. Пока я вижу с Вами обсуждать нечего. Все слишком сильно запущено.
=Тему можно закрывать=
...
Рейтинг: 0 / 0
Как сделать, чтобы приложение не запускалось второй раз
    #32767705
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi oleg_km!

1) Никто не говорил переписывать работающий код.
2) Надеюсь у Вас не вызывает сомнения, что микроскопом (самым заурядным,
оптическим) МОЖНО забивать гвозди? Причём достаточно эффективно.
3) С чего вы решили, что создаваемый Mutex не захватывается? В каноническом
коде он именно и захватывается при создании! И "отпускается на волю" при
завершении приложения. Совсем иное дело, что Wait* функции реально не
используются В ДАННОМ КОНТЕКСТЕ - ибо мы не запускаем ДРУГОЕ приложение,
которое должно дождаться завершения данного для своей работы. Но такая
ситуация вполне возможна. Особенно если в сисеме помимо обычных
интерактивных (GUI) приложений фунциклируют ещё и демоны/сервисы/BatchJob-ы
и тому подобное "подковёрное" ПО.

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
25 сообщений из 35, страница 1 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как сделать, чтобы приложение не запускалось второй раз
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]