Николай М.
1895 повідомлень
#16 років тому
Пишу прогу, нужно её автообновлять, применение батников допускается, но мне как настоящему параноику не нравится єтот вариант, есть парочка вариантов для 98 и для 2000, но нет для хрюши, ну и как всегда описанные возможности не документирование, второй день ищу как бы это замутить, братья дельфисти может кто такое делал, хотя.... братья програмери тоже подходит, в общем язык не важен, главное чтобы решеные было универсальное для всех известных ОС линейки NT+.
Максим Б.
2206 повідомлень
#16 років тому
NnCron
Николай М.
1895 повідомлень
#16 років тому
Планировщик.... хм..., но заставить юзера чтото ставить сложно, все сводится к одному екзешнику даже пришлось впихнуть DLL-ку распаковки архивов в екзешку, программа предназначена для полных ламеров, и будет тестироваться на предмет работоспособности на низких привилегиях, напр. - "пользователь", к сожалению отпадает установка постороннего софта, реалии суровые)
Тут М.
626 повідомлень
#16 років тому
А 2 exe-шника в поставке быть не может?
Николай М.
1895 повідомлень
#16 років тому
Цитата ("Demiurh"):
А 2 exe-шника в поставке быть не может?

Категорически не желательно.
Виктор Т.
1036 повідомлень
#16 років тому
Есть довольно простой вариант. Но он требует модификации обоих частей - и обновляемого приложения и обновления
Николай М.
1895 повідомлень
#16 років тому
Цитата ("Sivis"):
Есть довольно простой вариант. Но он требует модификации обоих частей - и обновляемого приложения и обновления

Ем.... поподробней плиз можно?)
Виктор Т.
1036 повідомлень
#16 років тому
1. Апдейтер убивает целевой процесс и удаляет целевой файл
2. Апдейтер извлекает из себя (или копирует сам себя) на место целевого файла
3. Апдейтер запускает целевое приложение с параметром "/ENDUPDATE <Имя файла-апдейтера>" и закрывается
4. Целевой процесс ждет освобождения апдейтера и удаляет его
5. Целевой процесс закрывается

Пункт 5 и имя параметра - по вкусу)

А можно еще удаляющий код заинжектить куда-нибудь)))
Сб Кайгородов
17 повідомлень
#16 років тому
Цитата ("Sivis"):
1. Апдейтер убивает целевой процесс и удаляет целевой файл
2. Апдейтер извлекает из себя (или копирует сам себя) на место целевого файла
3. Апдейтер запускает целевое приложение с параметром "/ENDUPDATE <Имя файла-апдейтера>" и закрывается
4. Целевой процесс ждет освобождения апдейтера и удаляет его
5. Целевой процесс закрывается

Пункт 5 и имя параметра - по вкусу)

А можно еще удаляющий код заинжектить куда-нибудь)))


поправил бы немного...

1) программа обновления находит обновление, сравнивает версию.. (ну или какие либо другие параметры)
2) программа обновления скачивает обновление под временным названием (типа прилижение_апдейт)
3) убивается процесс
4) убивается файл
5) новый переименовывается и запускается

простетская схема, построеная на логике...
Николай М.
1895 повідомлень
#16 років тому
Sivis, получится больше одной екзешки, думал может так...
в ресурс загоняю длл-ку, цепляю её кому нибудь, напр. експлореру, а он уже качает, апдейтит и т.д. но есть нюансы:
1. виста очень бережно относится к своим процессам
2. нужно подобрать универсальную "жертву" для такой инъекции
3. и в придачу антивируси и даже фаерволы палят подобное, конечно юзер сразу испугается и не станет позволять подобного, в прочем я бы сделал также)

Похоже остается самым оптимальным вариантом только классика - батник...

maloy_ksb,
Цитата:
3) убивается процесс
4) убивается файл
5) новый переименовывается и запускается


классика... но вот хочется сделать п.5 без промежуточных файлов, и чтоб надежно апдейтило
ну я ещё думал... как можно пославть винду подальше и отрезать себя от екзешки, но как не крутил, как не думал, скорее всего так не получится, к сожалению квалификации нехватает чтобы понять как загнать всю прогу в один сегмент памяти?((
Сергей Д.
326 повідомлень
#16 років тому
Хм... Я делал просто. В общем, без деталей, так:
1. при запуске программа проверяет, есть-ли обновление. Если нет, работает дальше обычно.
2. Если обновление есть, то запущенная программа ПЕРЕИМЕНОВЫВАЕТ свой exe-файл. Это работает. Удалить нельзя, а переименовать - пожалуйста.
3. Далее программа скачивает обновление, записывает исполняемый файл со "старым именем". Далее программа выдаёт сообщение: "обновление успешно установлено, перезапустите программу", и завершает свою работу.
Николай М.
1895 повідомлень
#16 років тому
Цитата ("oren"):
Хм... Я делал просто. В общем, без деталей, так:
1. при запуске программа проверяет, есть-ли обновление. Если нет, работает дальше обычно.
2. Если обновление есть, то запущенная программа ПЕРЕИМЕНОВЫВАЕТ свой exe-файл. Это работает. Удалить нельзя, а переименовать - пожалуйста.
3. Далее программа скачивает обновление, записывает исполняемый файл со "старым именем". Далее программа выдаёт сообщение: "обновление успешно установлено", перезапустите программу, и завершает свою работу.


Снимаю шляпу, не знал спасибо!!!

Попробовал на какомто инсталяторе проделать такое, все как бы хорошо почти, в общем если очень аккуратно то можно заюзать)
Сергей Д.
326 повідомлень
#16 років тому
Небольшое дополнение:
после обновления остаётся старая программа, записанная в какой-то временный файл. Так вот при запуске надо ещё проверять: остался ли мусор от старого обновления? И удалять...
У меня так программы обновляли себя в локальной сети и VPN. Сделал новую версию, баг какой-то исправил, выложил новый exe-ник в определённое место, и всё! Не надо бегать по всем клиентам, доп.офисам в разных частях города...
Виктор Т.
1036 повідомлень
#16 років тому
MMM_Corp, сорри, я думал что апдейтер должен быть одной экзешкой
Юрий Осадчий
661 повідомлення
#16 років тому
Делим программу на
- СТАРТЕР-АПДЕЙТЕР -- программу запускающую основной EXE, он проверяет обновления и качает их перед запуском
- основной EXE(при желании -- DLL)
Николай М.
1895 повідомлень
#16 років тому
Цитата ("ossadchy"):
Делим программу на
- СТАРТЕР-АПДЕЙТЕР -- программу запускающую основной EXE, он проверяет обновления и качает их перед запуском
- основной EXE(при желании -- DLL)

Все в одном флаконе должно бить, ни длл-ок сбоку, ни другого мусора, вариант - длл-ка в ресурсе - инъекция отпадает, большой риск нарватся на DEP, или антивирус зарубит скорее всего.
Вадим Т.
3240 повідомлень
#16 років тому
В одном флаконе можно сделать например так:

1. Проверяете наличие новой версии программы.
2. Сообщаете пользователю что вышла новая версия, предлагаете обновить.
3. Если пользователь согласен - скачиваете новую версию во временный каталог. Это лучше делать отдельным процессом, вдруг у кого-то медленный канал.
4. Когда скачается, предлагаете пользователю переустановить программу.
5. Если пользователь согласен - запускаете скаченную версию из временного каталога, это или Ваш инсталлятор, или эта же программа например с ключом /install, или еще как-либо.
6. Так как это другой процесс, то он может проверить наличие старой версии программы в памяти, и, при необходимости, завершить его.
7. После этого переписать себя (или новый exe с данными, или еще что нужно) на место старого.
8. Запустить новый процесс уже из нового места.
9. Новый процесс проверит, запущен ли он же (или инсталлятор) из временного каталога, если запущен - удалить его.
10. Почистить временный каталог от уже использованных файлов.
Виктор Т.
1036 повідомлень
#16 років тому
tvv, ну я примерно тоже самое хотел сказать, только у Вас понятней получилось)
Сергей С.
19 повідомлень
#16 років тому
Доброго времени суток всем. У меня данный вопрос реализован следующим образом.

Обновления выкладываются на сервер, о ктр прога знает. Приложение лежит на сервере в архиве. На сервере лежит также файлик с информацией о номере новой версии, об изменениях в ней. На сервере также лежит пхпшный скриптик, ктр парсит тот самый текстовый файлик в поисках номера версии. Приложение периодически (как в настройках выставлено) гетом получает результат этого скриптика и сравнивает полученный номер версии со своим собственным. И если версия на сервере больше чем его собственная, то запускается форма обновления (опять же в зависимости от настроек автоматом скачивает или ждет команды пользователя). После команды обновления, приложение переименовывает себя в имя.bak, качает архив с сервера, потом деархивирует его, удаляет архив, запускает екзеху,закрывает себя...
вот такая схема...есть еще мелкие нюансы, но в целом так...сбоев не наблюдается давно уже..
Вадим Т.
3240 повідомлень
#16 років тому
Цитата ("sslab"):
После команды обновления, приложение переименовывает себя в имя.bak, качает архив с сервера, потом деархивирует его, удаляет архив, запускает екзеху,закрывает себя...
вот такая схема...есть еще мелкие нюансы, но в целом так...сбоев не наблюдается давно уже..

А что будет, если программа переименует себе в имя.bak, и тут вдруг что-то случится и компьютер выключится? Или по какой-то причине обновление не скачается, или скачается с ошибкой, или не встанет?

IMHO, переименование себя - принципиально неверный путь.