Гость
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Обновление приложения / 25 сообщений из 30, страница 1 из 2
21.05.2004, 14:39
    #32528271
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление приложения
Есть следующий сценарий:
Приложение периодически во время своей работы проверяет наличие новой версии.
Если приложение обнаруживает свою новую версию, то запускает ее установку.

Надо обеспечить чтобы во время инсталляции приложение уже было завершено, чтобы избежать перезагрузку.

Кто как делает это ?
...
Рейтинг: 0 / 0
21.05.2004, 15:24
    #32528425
Black Savage
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление приложения
Баловство все это...
Лучше чтобы при запуске приложения осуществлялась такая проверка.
Чтобы не изгаляться у нас запускается не *.exe -файл приложения, а *.bat , где прописано, что если есть новые файлы, то их копировать в рабочий каталог на локальную машину. Ну примерно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
C:
CD \TheBest

xcopy X:\ C:\TheBest /D /Y
net time \\CoolServer /SET /YES
ourapp.exe

Правда, при этом у нас нет такого понятия, как инсталляция программы . Может из-за этого данный способ вам и не очень понравится, а так идея прекрасная. Это IMHO
...
Рейтинг: 0 / 0
21.05.2004, 15:24
    #32528426
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление приложения
Ну, а нельзя ли запустить еще одну программу, которая закроет вызвавшую ее, а затем запустит процесс установки?
И небоитесь ли негативных последствий при нецентрализованной смене версий приложения?
...
Рейтинг: 0 / 0
21.05.2004, 15:58
    #32528572
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление приложения
Black Savage
Лучше чтобы при запуске приложения осуществлялась такая проверка.

Это делается, но требуется еще и то, что я описал.

Локшин Марк
Ну, а нельзя ли запустить еще одну программу, которая закроет вызвавшую ее, а затем запустит процесс установки?

Вот я и интересуюсь у кого как сделано.

Локшин Марк
И небоитесь ли негативных последствий при нецентрализованной смене версий приложения?

Каких?
...
Рейтинг: 0 / 0
21.05.2004, 17:12
    #32528752
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление приложения
Во первых вопрос, где именно приложение ищет новую версию?
Может проще положить все на некий сервер, а клиенты пусть запускают программу прямо из сети?

А если клиенты живут в других городах - самое лучше решение все же будет InstallShield или его братья :)
...
Рейтинг: 0 / 0
21.05.2004, 19:32
    #32528943
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление приложения
Не уверен, все ли в курсе, что Synchronizer , который шёл с РВ6.5 и умеет синхронизировать с FTP (написан на VC++), теперь Open Souce и живёт вот тут:

http://powerbuilder.codexchange.sybase.com/files/documents/67/689/PB65Source.zip
...
Рейтинг: 0 / 0
21.05.2004, 20:22
    #32528979
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление приложения
Ну а более конкретно, можно так:
Там, где приложение обнаруживает свою новую версию (lb_boolean_newversion = TRUE), оно НЕ запускает ее установку, а вместо этого делает так:
Код: plaintext
1.
2.
3.
4.
IF lb_boolean_newversion  THEN
//м.б. MessageBox, типа хотите ли освежиться...
Run ( "программу, которая немножко Sleep, а потом запускает синхронизацию")
HALT CLOSE
END IF

Но в общем, на мой взгляд, если это конечно не "безоконный" deamon какой-то, который 24-7 бежит, то все эти периодические проверки, когда приложение УЖЕ бежит, никому не нужны. Я бы эту проверку делал ТОЛЬКО в Open event Application Objectа...
...
Рейтинг: 0 / 0
21.05.2004, 21:22
    #32529037
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление приложения
Филипп
Код: plaintext
1.
2.
Run ( "программу, которая немножко Sleep, а потом запускает синхронизацию")
HALT CLOSE


Сейчас так и сделано. Правда иногда этого самого Sleep недостаточно.
Вообще Run + HALT CLOSE работало под PB6 лет 5 без особых проблем, а вот когда попытались перейти на Pb9 - по HALT CLOSE возникает GPF (по PBDEBUG - на DESTROY одного из объектов). Причем на тестовом простом примере не удается повторить :(.
Собственно из-за этого я и начал копаться в этом коде.

Филипп Я бы эту проверку делал ТОЛЬКО в Open event Application Objectа...
Я уже тоже склоняюсь к этой мысли :))

White Owl Во первых вопрос, где именно приложение ищет новую версию?
Может проще положить все на некий сервер, а клиенты пусть запускают программу прямо из сети?

Проблема не в этом, а в том как запустить установку.
...
Рейтинг: 0 / 0
24.05.2004, 10:54
    #32530187
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление приложения
Anatoly Moskovsky
И не боитесь ли негативных последствий при нецентрализованной смене версий приложения?

Каких?
Ну каких... если у вас одновременно с базой работает несколько версий программы в которых разные алгоритмы обработки данных, то я бы не был бы уверен, что создав документ в первой версии, а затем подредактировав его во 2-й и 3-й он вообще где-либо будет открываться :)
...
Рейтинг: 0 / 0
24.05.2004, 11:41
    #32530308
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление приложения
Локшин Марк Ну каких... если у вас одновременно с базой работает несколько версий программы в которых разные алгоритмы обработки данных, то я бы не был бы уверен, что создав документ в первой версии, а затем подредактировав его во 2-й и 3-й он вообще где-либо будет открываться :)

Приложению известно с какой версией структуры БД нужно работать и с другими версиями оно не запускается.
Кроме того, если обнаруживается новая версия приложения, но она новее текущей версии БД, то обновление не предлагается.
...
Рейтинг: 0 / 0
24.05.2004, 15:49
    #32530947
Raven A
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление приложения
>Anatoly Moskovsky

Некоторый работающий скелет.
Имеем:
app.exe - приложение текущей версии
loader.exe - диспетчер
newarc.exe - для примера, self-extract с новой версией
Последовательность:
- app запрашивает наличие обновлений
- от сервера приходит newarc.exe (новая версия)
- app запускает loader с указанием: дождаться завершения app
и, после этого, выполнить последовательность действий
- loader дожидается завершения app, запускает newarc и,
по его окончанию, запускает новую версию app и завершается.

Понятно, что протокол более сложен, чем описано, но суть именно такова.
...
Рейтинг: 0 / 0
24.05.2004, 16:03
    #32530987
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление приложения
а пример реализации пункта
Код: plaintext
- app запускает loader с указанием: дождаться завершения app
можно? или хотя бы ф-и WinAPI в направлении которых копать по поводу ожидания завершения
...
Рейтинг: 0 / 0
24.05.2004, 16:22
    #32531046
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление приложения
FAQ

P.S. Гм. Я тут стараюсь понимаешь, FAQ наращиваю, а народ их не читает :(
...
Рейтинг: 0 / 0
24.05.2004, 16:31
    #32531074
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление приложения
Anatoly Moskovskyили хотя бы ф-и WinAPI в направлении которых копать по поводу ожидания завершения
А на WinAPI это будет WaitForSingleObject(...)
...
Рейтинг: 0 / 0
24.05.2004, 16:37
    #32531088
NewOne
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление приложения
Предложенного ASCRUSом FAQ вполне достаточно для начала. Если хочется большего - копай в сторону WaitForSingeObjectEx Win32 функции.

Имно, само приложение ничего не должно знать об обновлении, всё это дело стартера - более-менее универсальной программки кот. может пасти сразу несколько приложений.
...
Рейтинг: 0 / 0
24.05.2004, 16:54
    #32531139
rcryo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление приложения
Скрипт appstart.vbs

Dim SourceFolder, LogFile, CurrentPath, AppName

AppName = "app.exe"
SourceFolder = "\\Server\Distr\"
LogFile="autoupdate.log"

If CheckNewVersion(AppName) = True Then
' чтобы юзер понял что происходит и не жал запуск программы несколько раз
ON Error Resume Next
aChar = "merlin"
Set ACTL = CreateObject("Agent.Control.2")
ACTL.Connected = True
If isObject(ACTL) Then
ACTL.Connected = True
ACTL.Characters.Load aChar, aChar & ".acs"
If Err.Number = 0 Then
Set CREF = ACTL.Characters(aChar)
CREF.MoveTo 400, 300
CREF.Show
' CREF.Play "Explain"
CREF.Speak "Обновление программы..."
' CREF.Play "Announce"
CREF.MoveTo 0, 0
End If
end if
' копирование файлов
Call CopyFiles()
End if

' непосредственно запуск самой программы
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run AppName , 1, False

Function CheckNewVersion(asFileName)
Dim fso, f1, f2
CheckNewVersion = False

Set fso = CreateObject("Scripting.FileSystemObject")

' проверить дату модификации файла
IF fso.FileExists(SourceFolder + asFileName) then
Set f2 = fso.GetFile(SourceFolder + asFileName)
If fso.FileExists(asFileName) THEN
Set f1 = fso.GetFile(asFileName)
if DateDiff("s", f1.DateLastModified, f2.DateLastModified ) > 60 then
CheckNewVersion = True
end if
else
CheckNewVersion = True
end if
END IF
End Function

Sub CopyFiles()
Dim fso, f1, f2, MyFile, UFolder, UFile, OFolder
Set fso = CreateObject("Scripting.FileSystemObject")
Set UFolder = fso.getfolder(SourceFolder)
set UFile = UFolder.files
Set OFolder = fso.getfolder(".")

If (fso.FileExists(LogFile)) Then
Set MyFile = fso.OpenTextFile(LogFile, 8, True)
Else
Set MyFile = fso.CreateTextFile(LogFile)
end if

For Each f1 in UFile
fso.CopyFile UFolder&"\"&f1.Name, OFolder&"\"&f1.Name
MyFile.WriteLine(Cstr(Date)&" "&Cstr(Time)&" Файл "&f1.Name&" обновлен. Размер "&f1.Size)&". Дата "&f1.DateLastModified
Next
End Sub
...
Рейтинг: 0 / 0
24.05.2004, 17:28
    #32531219
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление приложения
to ASCRUS, rcryo:
Это все известно, но не то, что требуется. Требуется, чтобы запущенная в параллели программа дождалась завершения вызывающей.

За WaitForSingleObject спасибо to Локшин Марк, NewOne
...
Рейтинг: 0 / 0
04.06.2004, 12:37
    #32548347
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление приложения
ФилиппАнатолий, а что там стопориться, пойди сюда:
http://eric.aling.tripod.com/PB/tips/pbtip32.htm


Остановился на том, как получить handle уже запущеного приложения для передачи в waitforsingleobject
...
Рейтинг: 0 / 0
04.06.2004, 12:43
    #32548366
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление приложения
Handle(GetApplication()) не прошло,
ф-я завершается сразу, видимо это не тот хендл, а на подробный разбор времени не было еще.
...
Рейтинг: 0 / 0
04.06.2004, 15:03
    #32548746
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление приложения
Anatoly MoskovskyHandle(GetApplication()) не прошло,
ф-я завершается сразу, видимо это не тот хендл, а на подробный разбор времени не было еще.
Потому, что из IDE наверное эксперементировал? Нужно перестроить приложение и запускать exe иначе никаких handle'ов вам не видать.
Код: plaintext
MessageBox("",string(handle(this)))
Вот на open application прекрасно все возвращает. Следует заметить, что это одновременно является способом определения того, запустили ли проиложение из IDE или из exe.
...
Рейтинг: 0 / 0
04.06.2004, 15:07
    #32548757
leyka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление приложения
У меня появилась одна глупая идея. Выяснять насколько она глупая, времени нет.

Прога 1 - основное приложение
Прога 2 - инсталяшка

1. Прога 1 открывает некий файл с запретом чтения (записи).
2. Прога 1 запускает Прогу 2.
3. Прога 1 закрывает себя не закрывая файл явно.
4. Прога 2 ждёт по таймеру, пока тот файл не освободится.
5. Прога 2 делает обновление.
...
Рейтинг: 0 / 0
04.06.2004, 15:18
    #32548790
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление приложения
to Локшин Марк
нет, проверялось на собранном приложении, т.е. handle(getapplication()) != 0
...
Рейтинг: 0 / 0
04.06.2004, 16:06
    #32548905
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление приложения
авторнет, проверялось на собранном приложении, т.е. handle(getapplication()) != 0
Хм, действительно. Возвращается всегда одно и тоже число. Тогда не совсем понятно, что это за handle.
Зато есть функция GetCurrentProcess(). Но мо-моему там тоже не все будет просто ... Как-то это немного не так работает, как я ожидал. Надо будет подумать.
...
Рейтинг: 0 / 0
04.06.2004, 16:08
    #32548910
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление приложения
автор Зато есть функция GetCurrentProcess(). Но мо-моему там тоже не все будет просто ... Как-то это немного не так работает, как я ожидал. Надо будет подумать.
Я подумал :) , это не то, что нужно...
...
Рейтинг: 0 / 0
04.06.2004, 19:11
    #32549246
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление приложения
Анатолий, если логика остается той же, то бишь
EXEa, обнаружив, что надо обновляться, запускает EXEb, который теоретически должен дождаться завершения работы EXEa, тогда видимо проблема в том, что не с той стороны смотрите :-)

Надо, чтоб EXEa передавало в EXEb как commandparm или handle своего процесса, или handle mutexa, который EXEa создало, перед запуском EXEb.
EXEb в свою очередь, в applicaion's open event должно делать WaitForSingleObject ...
...
Рейтинг: 0 / 0
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Обновление приложения / 25 сообщений из 30, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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