Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обновление приложения в рантайм. [Win2k]


Inco ©   (2004-08-17 14:52:00) 

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

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

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


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

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


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


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

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


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

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


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

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


KSergey   (2004-08-24 17:18:00) [5]

> [11] Erik1   (24.08.04 17:14)

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


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

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


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

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

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

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


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

Понятно.

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


Digitman   (2004-08-17 16:19:00) [9]

см. rundll32.exe


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

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

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


Digitman   (2004-08-17 15:50:00) [11]


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


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

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

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


mOOx   (2004-08-17 15:49:00) [12]

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


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

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

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

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

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


Digitman   (2004-08-17 15:02:00) [14]

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


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

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


Anatoly Podgoretsky   (2004-08-17 14:56:00) [16]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо