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

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

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

Т.е. если при входе в приложение файл уже существует и еще не открыт в режиме EXCLUSIVE, значит последнее завершение приложения было некорректно.
...
Рейтинг: 0 / 0
28.10.2004, 13:39
    #32759127
Yura .
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать, чтобы приложение не запускалось второй раз
Вариант с DBF хороший, я сам его использовал. Очень редко, но все-таки случались ситуации, когда с момента старта программы до открытия контрольного файла программа успевала все-таки загрузиться дважды, но в принципе работает. Отказался потому, что требовалось запускать программу реально несколько раз параллельно для работы с разными базами данных.
Использовал так-же вариант открытия контрольного окна, сейчас уже не помню почему, но и от него отказался.
Из всех вариантов на фоксе самые надежные результаты мне дал вариант, когда после старта программы выдается приглашение на ввод сегодняшнего числа (например). Программа может загрузиться несколько раз, но если пользователь не ввел дату в которой он хочет работать (разумеется для даты сегодня достаточно было нажать всего одну кнопку), то через одну минуту приложение не получив отклика юзера корректно закрывается. Разумеется сколько-бы раз программа не стартовала, ответ от юзера получит только одна сессия.
В насстоящее время кроме этого я использую специально написанный на VC+ MFC стартер с вариантом Mutex. Результат прекрасный.
...
Рейтинг: 0 / 0
28.10.2004, 14:26
    #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
28.10.2004, 14:29
    #32759294
luser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать, чтобы приложение не запускалось второй раз
Маленькая неточность, нужно вот так :
Код: plaintext
hMutex =  CreateMutex(null, 0 , @lc_NameApp) && Захватывать не надо
...
Рейтинг: 0 / 0
28.10.2004, 18:30
    #32760017
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать, чтобы приложение не запускалось второй раз
2 luser

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

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

не понял, какой может быть конфуз. Mutant также убъется при выгрузке приложения, как и в другой Windows или я не прав
...
Рейтинг: 0 / 0
01.11.2004, 09:19
    #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
02.11.2004, 05:42
    #32764185
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать, чтобы приложение не запускалось второй раз
Hi Dushes!

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

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

С уважением
duШes
....return This.MultiColumnTreView.p_oNodes["key_node_13"].p_oSubItems[3].p_cText
...
Рейтинг: 0 / 0
02.11.2004, 09:57
    #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
02.11.2004, 13:24
    #32764888
luser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать, чтобы приложение не запускалось второй раз
А какая разница ? :)) Что мьтекс , что событие объекты ядра :))
...
Рейтинг: 0 / 0
02.11.2004, 13:36
    #32764920
luser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать, чтобы приложение не запускалось второй раз
Тогда уж самый просто способ, до загурзки главного окна делать
Declare Integer FindWindow in Win32Api string @, string @
Код: plaintext
1.
2.
if FindWindow( 0 ,<MymainFom.caption>)= 0 
  Return .F.
 endif
И усе, чтоб не мучаться.
...
Рейтинг: 0 / 0
02.11.2004, 13:37
    #32764926
luser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать, чтобы приложение не запускалось второй раз
Наоборт :
Код: plaintext
1.
2.
if FindWindow( 0 ,<MymainFom.caption>)!= 0 
    Return .F.
endif
...
Рейтинг: 0 / 0
03.11.2004, 02:12
    #32765794
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать, чтобы приложение не запускалось второй раз
Hi luser!

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

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

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

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

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

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

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


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