|
Обновление приложения
|
|||
---|---|---|---|
#18+
Есть следующий сценарий: Приложение периодически во время своей работы проверяет наличие новой версии. Если приложение обнаруживает свою новую версию, то запускает ее установку. Надо обеспечить чтобы во время инсталляции приложение уже было завершено, чтобы избежать перезагрузку. Кто как делает это ? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2004, 14:39 |
|
Обновление приложения
|
|||
---|---|---|---|
#18+
Баловство все это... Лучше чтобы при запуске приложения осуществлялась такая проверка. Чтобы не изгаляться у нас запускается не *.exe -файл приложения, а *.bat , где прописано, что если есть новые файлы, то их копировать в рабочий каталог на локальную машину. Ну примерно так: Код: plaintext 1. 2. 3. 4. 5. 6.
Правда, при этом у нас нет такого понятия, как инсталляция программы . Может из-за этого данный способ вам и не очень понравится, а так идея прекрасная. Это IMHO ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2004, 15:24 |
|
Обновление приложения
|
|||
---|---|---|---|
#18+
Ну, а нельзя ли запустить еще одну программу, которая закроет вызвавшую ее, а затем запустит процесс установки? И небоитесь ли негативных последствий при нецентрализованной смене версий приложения? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2004, 15:24 |
|
Обновление приложения
|
|||
---|---|---|---|
#18+
Black Savage Лучше чтобы при запуске приложения осуществлялась такая проверка. Это делается, но требуется еще и то, что я описал. Локшин Марк Ну, а нельзя ли запустить еще одну программу, которая закроет вызвавшую ее, а затем запустит процесс установки? Вот я и интересуюсь у кого как сделано. Локшин Марк И небоитесь ли негативных последствий при нецентрализованной смене версий приложения? Каких? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2004, 15:58 |
|
Обновление приложения
|
|||
---|---|---|---|
#18+
Во первых вопрос, где именно приложение ищет новую версию? Может проще положить все на некий сервер, а клиенты пусть запускают программу прямо из сети? А если клиенты живут в других городах - самое лучше решение все же будет InstallShield или его братья :) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2004, 17:12 |
|
Обновление приложения
|
|||
---|---|---|---|
#18+
Не уверен, все ли в курсе, что Synchronizer , который шёл с РВ6.5 и умеет синхронизировать с FTP (написан на VC++), теперь Open Souce и живёт вот тут: http://powerbuilder.codexchange.sybase.com/files/documents/67/689/PB65Source.zip ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2004, 19:32 |
|
Обновление приложения
|
|||
---|---|---|---|
#18+
Ну а более конкретно, можно так: Там, где приложение обнаруживает свою новую версию (lb_boolean_newversion = TRUE), оно НЕ запускает ее установку, а вместо этого делает так: Код: plaintext 1. 2. 3. 4.
Но в общем, на мой взгляд, если это конечно не "безоконный" deamon какой-то, который 24-7 бежит, то все эти периодические проверки, когда приложение УЖЕ бежит, никому не нужны. Я бы эту проверку делал ТОЛЬКО в Open event Application Objectа... ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2004, 20:22 |
|
Обновление приложения
|
|||
---|---|---|---|
#18+
Филипп Код: plaintext 1. 2.
Сейчас так и сделано. Правда иногда этого самого Sleep недостаточно. Вообще Run + HALT CLOSE работало под PB6 лет 5 без особых проблем, а вот когда попытались перейти на Pb9 - по HALT CLOSE возникает GPF (по PBDEBUG - на DESTROY одного из объектов). Причем на тестовом простом примере не удается повторить :(. Собственно из-за этого я и начал копаться в этом коде. Филипп Я бы эту проверку делал ТОЛЬКО в Open event Application Objectа... Я уже тоже склоняюсь к этой мысли :)) White Owl Во первых вопрос, где именно приложение ищет новую версию? Может проще положить все на некий сервер, а клиенты пусть запускают программу прямо из сети? Проблема не в этом, а в том как запустить установку. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2004, 21:22 |
|
Обновление приложения
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky И не боитесь ли негативных последствий при нецентрализованной смене версий приложения? Каких? Ну каких... если у вас одновременно с базой работает несколько версий программы в которых разные алгоритмы обработки данных, то я бы не был бы уверен, что создав документ в первой версии, а затем подредактировав его во 2-й и 3-й он вообще где-либо будет открываться :) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2004, 10:54 |
|
Обновление приложения
|
|||
---|---|---|---|
#18+
Локшин Марк Ну каких... если у вас одновременно с базой работает несколько версий программы в которых разные алгоритмы обработки данных, то я бы не был бы уверен, что создав документ в первой версии, а затем подредактировав его во 2-й и 3-й он вообще где-либо будет открываться :) Приложению известно с какой версией структуры БД нужно работать и с другими версиями оно не запускается. Кроме того, если обнаруживается новая версия приложения, но она новее текущей версии БД, то обновление не предлагается. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2004, 11:41 |
|
Обновление приложения
|
|||
---|---|---|---|
#18+
>Anatoly Moskovsky Некоторый работающий скелет. Имеем: app.exe - приложение текущей версии loader.exe - диспетчер newarc.exe - для примера, self-extract с новой версией Последовательность: - app запрашивает наличие обновлений - от сервера приходит newarc.exe (новая версия) - app запускает loader с указанием: дождаться завершения app и, после этого, выполнить последовательность действий - loader дожидается завершения app, запускает newarc и, по его окончанию, запускает новую версию app и завершается. Понятно, что протокол более сложен, чем описано, но суть именно такова. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2004, 15:49 |
|
Обновление приложения
|
|||
---|---|---|---|
#18+
а пример реализации пункта Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2004, 16:03 |
|
Обновление приложения
|
|||
---|---|---|---|
#18+
Anatoly Moskovskyили хотя бы ф-и WinAPI в направлении которых копать по поводу ожидания завершения А на WinAPI это будет WaitForSingleObject(...) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2004, 16:31 |
|
Обновление приложения
|
|||
---|---|---|---|
#18+
Предложенного ASCRUSом FAQ вполне достаточно для начала. Если хочется большего - копай в сторону WaitForSingeObjectEx Win32 функции. Имно, само приложение ничего не должно знать об обновлении, всё это дело стартера - более-менее универсальной программки кот. может пасти сразу несколько приложений. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2004, 16:37 |
|
Обновление приложения
|
|||
---|---|---|---|
#18+
Скрипт 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2004, 16:54 |
|
Обновление приложения
|
|||
---|---|---|---|
#18+
to ASCRUS, rcryo: Это все известно, но не то, что требуется. Требуется, чтобы запущенная в параллели программа дождалась завершения вызывающей. За WaitForSingleObject спасибо to Локшин Марк, NewOne ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2004, 17:28 |
|
Обновление приложения
|
|||
---|---|---|---|
#18+
ФилиппАнатолий, а что там стопориться, пойди сюда: http://eric.aling.tripod.com/PB/tips/pbtip32.htm Остановился на том, как получить handle уже запущеного приложения для передачи в waitforsingleobject ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2004, 12:37 |
|
Обновление приложения
|
|||
---|---|---|---|
#18+
Handle(GetApplication()) не прошло, ф-я завершается сразу, видимо это не тот хендл, а на подробный разбор времени не было еще. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2004, 12:43 |
|
Обновление приложения
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyHandle(GetApplication()) не прошло, ф-я завершается сразу, видимо это не тот хендл, а на подробный разбор времени не было еще. Потому, что из IDE наверное эксперементировал? Нужно перестроить приложение и запускать exe иначе никаких handle'ов вам не видать. Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2004, 15:03 |
|
Обновление приложения
|
|||
---|---|---|---|
#18+
У меня появилась одна глупая идея. Выяснять насколько она глупая, времени нет. Прога 1 - основное приложение Прога 2 - инсталяшка 1. Прога 1 открывает некий файл с запретом чтения (записи). 2. Прога 1 запускает Прогу 2. 3. Прога 1 закрывает себя не закрывая файл явно. 4. Прога 2 ждёт по таймеру, пока тот файл не освободится. 5. Прога 2 делает обновление. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2004, 15:07 |
|
Обновление приложения
|
|||
---|---|---|---|
#18+
to Локшин Марк нет, проверялось на собранном приложении, т.е. handle(getapplication()) != 0 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2004, 15:18 |
|
Обновление приложения
|
|||
---|---|---|---|
#18+
авторнет, проверялось на собранном приложении, т.е. handle(getapplication()) != 0 Хм, действительно. Возвращается всегда одно и тоже число. Тогда не совсем понятно, что это за handle. Зато есть функция GetCurrentProcess(). Но мо-моему там тоже не все будет просто ... Как-то это немного не так работает, как я ожидал. Надо будет подумать. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2004, 16:06 |
|
Обновление приложения
|
|||
---|---|---|---|
#18+
автор Зато есть функция GetCurrentProcess(). Но мо-моему там тоже не все будет просто ... Как-то это немного не так работает, как я ожидал. Надо будет подумать. Я подумал :) , это не то, что нужно... ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2004, 16:08 |
|
Обновление приложения
|
|||
---|---|---|---|
#18+
Анатолий, если логика остается той же, то бишь EXEa, обнаружив, что надо обновляться, запускает EXEb, который теоретически должен дождаться завершения работы EXEa, тогда видимо проблема в том, что не с той стороны смотрите :-) Надо, чтоб EXEa передавало в EXEb как commandparm или handle своего процесса, или handle mutexa, который EXEa создало, перед запуском EXEb. EXEb в свою очередь, в applicaion's open event должно делать WaitForSingleObject ... ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2004, 19:11 |
|
|
start [/forum/topic.php?fid=15&msg=32530187&tid=1339102]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
155ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
others: | 252ms |
total: | 510ms |
0 / 0 |