Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.12;
Скачать: CL | DM;

Вниз

Обновление приложения в рантайм.   Найти похожие ветки 

 
Inco   (2004-08-17 14:52) [0]

Задача такая: приложение должно обновить само себя во время выполнения.

Приложение состоит из одного exe-файла. При запуске проверяется наличие обновления, затем мы его скачиваем на локальный диск, и далее...

Скажите, пожалуйста, какие пути решения этой задачи существуют, или могут быть. Сам что-то не могу найти ничего путевого, кроме простенького примера удаления файла приложения из самого себя.


 
Anatoly Podgoretsky ©   (2004-08-17 14:56) [1]

При монолитном файле генерируй бат файл.


 
Amoeba ©   (2004-08-17 15:00) [2]

Загляни сюда:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1033


 
Digitman ©   (2004-08-17 15:02) [3]

если не выкрутасничать и ориентироваться на штатные механизмы (предусматривающие перезагрузку для вступления в силу обновленных модулей), то решение - проще пареной репы


 
Inco   (2004-08-17 15:45) [4]

Нет, как раз перезагрузка не подходит по всем причинам.

Можно конечно, через бат-файл, но не хочется создавать на диске лишних файлов (хоть они потом и стираются). Это оставим на крайний случай.

Можно еще перенести весь функционал в DLL, а в exe оставить их загрузчик и обновитель, но это не подходит по причинам работы с компонентами.

Есть ли еще какие-нибудь способы обновить приложение из самого себя? Хотя бы просто идеи, может даже бредовые.


 
mOOx ©   (2004-08-17 15:49) [5]

А чем бат не нравиться? Комп все равно веть выключается. Когда загрузится в следующий раз - обновиться. Или оперативность ПРОСТО НЕОБХОДИМА?


 
Digitman ©   (2004-08-17 15:50) [6]


> Можно еще перенести весь функционал в DLL


вот это как раз и один из реальных вариантов

стартуешь эту ДЛЛ в суррогатном процессе, тут же закругляешься

стартовавшая ДЛЛ ждет пока ты закруглишься и обновляет тебя, после чего сама закругляется, а ее файл уничтожается (будучи созданным как временный)


 
Inco   (2004-08-17 15:58) [7]

>оперативность ПРОСТО НЕОБХОДИМА
Да, оперативность абсолютно необходима. Обновление должно проверяться (и происходить) при каждом запуске.

2 Digitman © (17.08.04 15:50) [6]
>стартуешь эту ДЛЛ в суррогатном процессе
А можно об этом поподробнее?
Имеется в виду, что эту DLL надо загрузитьв отдельном Thread? Но ведь он завершиться при выходе из приложения.


 
Digitman ©   (2004-08-17 16:19) [8]

см. rundll32.exe


 
Inco   (2004-08-17 16:47) [9]

Понятно.

Спасибо всем ответившим, и отдельно Digitman.


 
Inco   (2004-08-24 16:29) [10]

Я нашел способ обновления приложения, как мне кажется, наипростейший. Работает на ура.
Получаем файл из сети (или еще откуда-нибудь) и помещаем его в temp-директорию, после этого прямо из запущенного приложения переименовываем наш exe-файл, например temp.exe (функция MoveFile), затем переносим полученный файл из temp-каталога в каталог нашего приложения. Остается запустить новый exe-файл (CreateProcess) и завершиться.
Новый ехе при запуске удаляет temp.exe и вуаля! Приложение обновлено из него самого в рантайме, без бат-файлов и перезагрузок.

Интересно, но нигде не нашел описания приведенного способа обновления. Понятно, что такой способ хорош только для Винды, но неужели никто так не делал?.. Скорее всего есть какие-то подводные камни, если кто их видит, прошу поделиться.

Могу помочь кодом из Билдера, если кому нужно. К сожалению почты нет и выход в Интернет очень нерегулярный. Пишите запрос здесь, я запостю.


 
Erik1   (2004-08-24 17:14) [11]

Это плохой способ, поскольку часто неработает. Windows может заблокировать фаил от переименования и что ты тогда будеш делать?
 Я делал такой механизм для реального проекта, наиболее устойчивый вариант это второй маленький exe фаил который запускается и ждет завершения основного процеса, после распаковывает архив и запускает главную программу. Сам распаковщик тоже обновляется или скачивается по новой из сети если его нет. Размер распаковшика Zip архива 71Кб.


 
KSergey ©   (2004-08-24 17:18) [12]

> [11] Erik1   (24.08.04 17:14)

По-моему, самый простой способ. А нелюбителей вторых файлов.. Так все равно ведь DLL будет иметь место быть!


 
Inco   (2004-08-24 17:34) [13]

2 Erik1   (24.08.04 17:14) [11]
>Windows может заблокировать фаил от переименования
Как это происходит? Windows время от времени это делает или как?


 
Erik1   (2004-08-25 09:54) [14]

В серезном приложении это происходит почти всегда, на тестовом примере мне неудалось получить подобную ситуацию(Windows 2000).


 
КаПиБаРа ©   (2004-08-25 10:13) [15]


> после этого прямо из запущенного приложения переименовываем
> наш exe-файл

Нет гарантии что этот способ будет работать всегда.
Вариант с 2-мя exe самый надежный.


 
Erik1   (2004-08-25 11:17) [16]

Могу даже в кладовку выложить, там много мелочей было. Выяснилось только во время работы, а работать пришлось начиная от Win 95 до XP(самая противная), Windows 2000(меньше всего проблем)



Страницы: 1 вся ветка

Текущий архив: 2004.09.12;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.024 c
14-1093455128
Ertong
2004-08-25 21:32
2004.09.12
Процесс System


14-1093105357
Черный прапор
2004-08-21 20:22
2004.09.12
Сталкивались ли вы с переводом ресурсов (локализацией)


14-1093120730
i-s-v
2004-08-22 00:38
2004.09.12
Ancient


14-1093508032
YurikGL
2004-08-26 12:13
2004.09.12
Кибертерроризм или бред Касперского


9-1084886895
istemy
2004-05-18 17:28
2004.09.12
Сферические координаты в OpenGL в проектах Delphi