Текущий архив: 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.48 MB
Время: 0.021 c