Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.033 c
3-1092395223
REA
2004-08-13 15:07
2004.09.12
Маленький ComboBox


11-1080574652
nester
2004-03-29 19:37
2004.09.12
Как отобразить картинку на форме с прозрачным фоном.


8-1088146420
0rg
2004-06-25 10:53
2004.09.12
Синхронное проигрывание звука


6-1089194918
Аноним
2004-07-07 14:08
2004.09.12
Indy (idTCPServer) + синхронизация с VCL thread


4-1091194337
nexxiss
2004-07-30 17:32
2004.09.12
ALT+TAB





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский