![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обновление приложения в рантайм. [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]При монолитном файле генерируй бат файл.