Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Повторное открытие приложения / 21 сообщений из 21, страница 1 из 1
25.02.2005, 12:49:26
    #32933268
ksusha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторное открытие приложения
Добрый день всем!
Подскажите, пожалуйста, как можно запретить повторное открытие приложения. То есть если оно уже открыто, чтобы при повторном открытии оно не открывалось. Многопользовательский доступ не нужен, прога только на оотдельном компе.
Спасибо.
...
Рейтинг: 0 / 0
25.02.2005, 13:13:15
    #32933359
FM32YO aka KID
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторное открытие приложения
код не мой - сразу говорю.. но у меня работает

DECLARE LONG FindWindow IN Win32API;
STRING lpClassName;
,STRING lpWindowName

lhWnd = FindWindow(NULL, "Моя программа")
IF lhWnd # 0
= MESSAGEBOX("Эй дружище!!! Моя программа уже запущена", "А не фиг не поискав на панели еще раз запускать!")
QUIT
Endif
...
Рейтинг: 0 / 0
25.02.2005, 13:13:41
    #32933363
AleksMed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторное открытие приложения
Если зайти в Поиск и набрать что то вроде "запрет повторног запуска", то думаю там читать не перечитать :)
...
Рейтинг: 0 / 0
25.02.2005, 13:21:45
    #32933390
AleksMed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторное открытие приложения
Тоже не мой. Доработан на поиск окна по постоянной части заголовка и активации приложения если оно уже запущено.

Код: 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.
*!*	Function IsWindowExist

parameters WindowName

if parameters() =  0 
	WindowName = ''
else
	WindowName = trim(WindowName)
endif

IsWindEx =  0 

set library to sys( 2004 ) + "Foxtools.fll"

* Register the Windows API functions that will be called
mGetWinTxt = RegFn("GetWindowText", "I@CI", "I")
mGetWindow = RegFn("GetWindow", "II", "I")
mIsWinVis =  RegFn("IsWindowVisible", "I", "I")

* Get the HWND (handle) to the main FoxPro window
foxhwnd = MAINHWND()

* Produce a list of all windows
hwndNext = CallFn(mGetWindow,foxhwnd, 0 )

do while hwndNext <>  0 
	if (hWndNext <> foxhWnd) and CallFn(mGetWindow,hWndNext, 4 ) =  0  and CallFn(mIsWinVis,hWndNext) <>  0 
		Stuffer = space( 64 )
		x = CallFn(mGetWinTxt,hWndNext,@Stuffer, 64 )
		if WindowName $ Stuffer
			IsWindEx = hWndNext
			exit
		endif
	endif
	hWndNext = CallFn(mGetWindow,hWndNext, 2 )
enddo

set library to

return IsWindEx 
...
Рейтинг: 0 / 0
26.02.2005, 22:37:37
    #32935171
oleg_km
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторное открытие приложения
В поиске набери Mutex, найдешь обсуждение с 1000 и одним вариантом
...
Рейтинг: 0 / 0
27.02.2005, 14:25:46
    #32935385
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторное открытие приложения
Hi AleksMed!

Какой кошмар :( Видать ещё с FPW перетащено :(

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
27.02.2005, 19:48:57
    #32935511
AleksMed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторное открытие приложения
Igor Korolyov
Hi AleksMed!

Какой кошмар :( Видать ещё с FPW перетащено :(

Posted via ActualForum NNTP Server 1.1

Ну, "какой кошмар" - это не аргумент :)
Процедура работает и нареканий не было :)
...
Рейтинг: 0 / 0
28.02.2005, 10:28:17
    #32935869
ksusha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторное открытие приложения
Большое спасибо!
...
Рейтинг: 0 / 0
01.03.2005, 00:16:14
    #32937506
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторное открытие приложения
Hi AleksMed!

Дык оно 1001 способом сделать можно, причём половина из них будут иметь
существенные недостатки - например твой как обычно исходит из предположения
что заголовок приложения (пускай даже только первая его часть!) во-первых
неизменен, и во-вторых уникален в пределах системы.
Кроме того пользоваться 16-битным посредником RegFn + CallFn в более-менее
свежем VFP - где есть полноценное DECLARE DLL для этих целей - это большое
извращение однако :)

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
01.03.2005, 09:09:33
    #32937744
AleksMed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторное открытие приложения
Igor Korolyov
Hi AleksMed!

Дык оно 1001 способом сделать можно, причём половина из них будут иметь
существенные недостатки - например твой как обычно исходит из предположения
что заголовок приложения (пускай даже только первая его часть!) во-первых
неизменен, и во-вторых уникален в пределах системы.
Кроме того пользоваться 16-битным посредником RegFn + CallFn в более-менее
свежем VFP - где есть полноценное DECLARE DLL для этих целей - это большое
извращение однако :)

Posted via ActualForum NNTP Server 1.1

:) Ну по поводу изменения заголовка можно дискутировать долго и каждый останеться при своем мнении. Думаю что неизменная постоянная составляющая в заголовке должна присутствовать всегда (например, название приложения), вот по ней то и будем ориентироваться и вести поиск вхождения в заголовок по $.

На счет RegFn и CallFn - прав, но пока переделывать лень :)
...
Рейтинг: 0 / 0
15.06.2005, 17:09:01
    #33117952
Новоселов Олег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторное открытие приложения
Hi ksusha!

Вставь в начало главного(стартового) файла проекта
обычно он называется ..._app.prg (например, что-то типа: my _app.prg)


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
#DEFINE SW_MAXIMIZE  3 
#DEFINE SW_RESTORE  9 
DECLARE LONG FindWindow IN WIN32API STRING @STR1,STRING @STR2
DECLARE INTEGER ShowWindow IN win32api INTEGER, INTEGER
DECLARE INTEGER SetForegroundWindow IN user32 INTEGER hWindow 

LOCAL hWindow
hWindow=FindWindow('my8c000000','Моя программа, ver.1.0 2005')
IF hWindow> 0   && уже запущена
   DECLARE INTEGER InvalidateRect IN User32.dll INTEGER, INTEGER, INTEGER

   ShowWindow(hWindow,SW_MAXIMIZE)  && развернуть минимизированное
   SetForegroundWindow(hWindow)  && сделать активным
   InvalidateRect( 0 ,  0 ,  1 )    && перисовать, важно если нет открытых форм

   RETURN 
ENDIF 

заменить:

'my 6 c000000' - в 6 VFP
'my 7 c000000' - в 7 VFP
'my 8 c000000' - в 8 VFP
...
Рейтинг: 0 / 0
15.06.2005, 17:16:47
    #33117978
Новоселов Олег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторное открытие приложения
При данном способе, запущенный ранее экземпляр приложения,
не только станет активным, но и развернется с панели задач.

Не нужно будет писать
MESSAGEBOX("Программа уже запущена", "Ткните мышкой по свернутому окну !"),
а пользователю искать нужное окно, если у него запущено много приложений
...
Рейтинг: 0 / 0
16.06.2005, 03:43:43
    #33118513
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторное открытие приложения
Hi Олег!

Ты серьёзно считаешь что у всех приложения называются My.exe :)
И кроме того с чего ты решил что заголовок приложения не изменяется в
процессе его работы :) Попробуй банально развернуть MDI окошко (если своего
такого вдруг не завёл, возьми Report Preview) на весь экран и посмотри что
стало с заголовком.
В общем это один из наиболее ограниченных способов - в смысле что
ограничений по его использованию тьма.

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
16.06.2005, 10:16:19
    #33118791
lesha_spb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторное открытие приложения
у меня несколько специфичный случай. каждое приложение может открываться только в одном экземпляре(т.е. один клиент - одно приложение), БД на sql server
в main'e поставил такую штуку:
LOCAL IsReturn
TRY
OPEN DATABASE uz
IsReturn = .F.
CATCH
IsReturn = .T.
ENDTRY
IF IsReturn
RETURN
ENDIF

Т.е. при повторном открытие проекта возникает ошибка("Доступ к файлу запрещен"), и в этом случае я отсекаю повторный запуск
...
Рейтинг: 0 / 0
16.06.2005, 12:45:54
    #33119220
Новоселов Олег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторное открытие приложения
Hi Igor!

1) Приложение может называться как угодно:
you.exe, my.exe, test1.exe, program2005.exe и т.д.

Следовательно FOX будет регистрировать следующие классы:
'you8c000000', 'my8c000000', 'test18c000000', 'program20058c000000' и т.д.

поэтому, в FindWindow нужно подставить, первым параметром, поиск соответствущего класса (каждый знает имя своего EXE-ника + '8c000000').

2) по Report Preview - не знал. БОЛЬШОЕ СПАСИБО за важное замечание.
Придется как-то решать эту проблему.


Вообще-то склоняюсь зделать запускалку на С++ (есть тому большое число плюсов)
...
Рейтинг: 0 / 0
16.06.2005, 12:59:56
    #33119272
Новоселов Олег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторное открытие приложения
FindWindow('имя класса', NULL ) не подходит, т.к. к этому моменту главное окно приложения уже создано,
поэтому такой поиск возможен только из другой программы.

И тогда, по барабану какой заголовок у окна, поиск работает как часы.
...
Рейтинг: 0 / 0
16.06.2005, 13:05:16
    #33119297
Yura .
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторное открытие приложения
Совершенно верно. Я уже много лет использую стартер, причем последний вариант написан именно на CPP. Для контроля повторного запуска использую вариант с Mutex.
...
Рейтинг: 0 / 0
17.06.2005, 02:51:10
    #33120737
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторное открытие приложения
Hi Олег!

Ну уже лучше :)
Но писать лоадер на C мне кажется совершенно не нужно. Лоадер замечательно пишется на фоксе - и работа с Mutex и поиск "предыдущего экземпляра" всё это сравнительно простые операции. Более того данный код неоднократно публиковался и тут и на forum.foxclub.ru - достаточно поискать скажем по слову "CreateMutex".

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
17.06.2005, 10:50:27
    #33121176
Yura .
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторное открытие приложения
Да, стартер можно написать на чем угодно. В свое время у меня были варианты на бейсике, на паскале, на турбо-паскале по виндовс, на делфи, последний на СРР, многофункциональный.
Первые бейсиковские варианты тогда умели различать среду DOS или Win95 (Win98). Это нужно было для того, что-бы если DOS, то загрузить сначала Win3.11, и сразу в нем на выполнение программу на FPW2.6.
Последний стартует не только фоксовую программу, но и еще ряд чего другого, смотря что лежит рядом, умеет перед запуском обновить екзешник приложения, кроме того он-же у меня работает на автозапуске с компашек, поэтому в данном случае СРР оправдан.
...
Рейтинг: 0 / 0
17.06.2005, 13:06:33
    #33121682
Новоселов Олег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторное открытие приложения
Hi Igor, Yura !

Попробовал Mutex, действительно короче, проще и кажется быстрее.

Только для разворота свернутого окна пришлось

Код: 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.
TCHAR mybuf1[MAX_LOADSTRING];
TCHAR mybuf2[MAX_LOADSTRING];

HWND pWndFind;
if (pWndFind = FindWindow(myRegisterClass,NULL)) 
{	
   while (pWndFind=GetNextWindow(pWndFind, GW_HWNDNEXT) )
   {	
      GetClassName(pWndFind,mybuf1,MAX_LOADSTRING);
      if ( strcmp(mybuf1, myRegisterClass)== 0  )
      {
            GetWindowText(pWndFind, mybuf2, MAX_LOADSTRING);

            if ( strlen(mybuf2)> 0  )
                  break;
      }
   }

   GetLastActivePopup(pWndFind);
   if ( IsIconic(pWndFind) )
      ShowWindow(pWndFind,SW_RESTORE);

   SetForegroundWindow(pWndFind);

   InvalidateRect( 0 ,  0 , TRUE);

   return FALSE;
}
раскрывает свернутое приложение при любом изменении заголовка главного окна.

Заинтересовало: "умеет перед запуском обновить екзешник приложения"
(уже воплотил в жизнь :) через текстовый *.INI файл, чтобы работать с любой фоксовой прогой)

Спасибо всем за отличные идеи!
...
Рейтинг: 0 / 0
17.06.2005, 14:32:01
    #33121979
Yura .
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторное открытие приложения
Для обновления экзешника приложения я использовал очень простой вариант:
Если рядом с MyProg.exe лежит MyProg.new, то это и есть сигнал для стартера, что-бы заменить старый екзешник на новый, в свою очередь само приложение так-же проверяет наличие стартера.new, и если есть, обновляет его.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Повторное открытие приложения / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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