powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Обновление приложения
30 сообщений из 30, показаны все 2 страниц
Обновление приложения
    #32528271
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть следующий сценарий:
Приложение периодически во время своей работы проверяет наличие новой версии.
Если приложение обнаруживает свою новую версию, то запускает ее установку.

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

Кто как делает это ?
...
Рейтинг: 0 / 0
Обновление приложения
    #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
Обновление приложения
    #32528426
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, а нельзя ли запустить еще одну программу, которая закроет вызвавшую ее, а затем запустит процесс установки?
И небоитесь ли негативных последствий при нецентрализованной смене версий приложения?
...
Рейтинг: 0 / 0
Обновление приложения
    #32528572
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Black Savage
Лучше чтобы при запуске приложения осуществлялась такая проверка.

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

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

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

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

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

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

http://powerbuilder.codexchange.sybase.com/files/documents/67/689/PB65Source.zip
...
Рейтинг: 0 / 0
Обновление приложения
    #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
Обновление приложения
    #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
Обновление приложения
    #32530187
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
И не боитесь ли негативных последствий при нецентрализованной смене версий приложения?

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

Приложению известно с какой версией структуры БД нужно работать и с другими версиями оно не запускается.
Кроме того, если обнаруживается новая версия приложения, но она новее текущей версии БД, то обновление не предлагается.
...
Рейтинг: 0 / 0
Обновление приложения
    #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
Обновление приложения
    #32530987
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а пример реализации пункта
Код: plaintext
- app запускает loader с указанием: дождаться завершения app
можно? или хотя бы ф-и WinAPI в направлении которых копать по поводу ожидания завершения
...
Рейтинг: 0 / 0
Обновление приложения
    #32531046
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FAQ

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

Имно, само приложение ничего не должно знать об обновлении, всё это дело стартера - более-менее универсальной программки кот. может пасти сразу несколько приложений.
...
Рейтинг: 0 / 0
Обновление приложения
    #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
Обновление приложения
    #32531219
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to ASCRUS, rcryo:
Это все известно, но не то, что требуется. Требуется, чтобы запущенная в параллели программа дождалась завершения вызывающей.

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


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

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

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

Надо, чтоб EXEa передавало в EXEb как commandparm или handle своего процесса, или handle mutexa, который EXEa создало, перед запуском EXEb.
EXEb в свою очередь, в applicaion's open event должно делать WaitForSingleObject ...
...
Рейтинг: 0 / 0
Обновление приложения
    #32549301
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так и хочу сделать.
Осталось только выяснить, как получить handle своего процесса.
...
Рейтинг: 0 / 0
Обновление приложения
    #32549331
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GetCurrentProcessId -> OpenProcess.

Может с mutexом даже проще будет...
...
Рейтинг: 0 / 0
Обновление приложения
    #32549713
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Филипп GetCurrentProcessId -> OpenProcess.

Я так эксперементировал, но что-то у меня не получилось. Нет времени уточнять, но у меня такое подозрение, что этот handle будет корректен только в контексте того процесса который делает OpenProcess.
...
Рейтинг: 0 / 0
Обновление приложения
    #32549717
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЯ так эксперементировал, но что-то у меня не получилось. Нет времени уточнять, но у меня такое подозрение, что этот handle будет корректен только в контексте того процесса который делает OpenProcess.
Все так и есть...
Но все работает... Если кто еще не понял :) , то передавать надо код из GetCurrentProcessId
...
Рейтинг: 0 / 0
Обновление приложения
    #32552146
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо!
Вобщем сделал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
  1 -я программа 
   - определяет свой ProcessID (GetCurrentProcessId) 
   - вызывает  2 -ю программу и передает туда свой PID
  2 -я программа 
   - открывает просесс 
      h = OpenProcess(SYNCHRONIZE, FALSE, pid)
   - вызывает WaitForSingleObject(h, timeout)
   - выполняет нужные действия
...
Рейтинг: 0 / 0
30 сообщений из 30, показаны все 2 страниц
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Обновление приложения
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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