Delphi как программе обновить саму себя

от admin

Delphi как программе обновить саму себя

Как создать службу обновления программного обеспечения, которая тоже могла бы обновляться сама?

Я знаю, что многие программы обновляются совместно установленной службой Windows. Я сделал эту службу помощником по обновлению и сервером данных для моего клиентского приложения. Но я застрял в том, как мне управлять своим клиентским приложением из этой службы.

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

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

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

Если служба находится в сеансе 0, она не сможет повторно запустить клиента в том же пользовательском сеансе.

Другая возможная проблема — когда сам сервис нуждается в обновлении. Это может быть решено обновлением клиентом, а не самим собой.

Итак, в случае обновления клиента и сервера, мне нужно создать третье приложение для выполнения этой работы. если это третье приложение является консольным, то запустить его из службы не составит труда, верно?

Если есть решение, которое не включает это третье приложение, оно будет лучшим.

Служба — это не просто служба обновлений, а сервер для информирования пользователей о доступе и правах. Главное клиентское приложение не будет напрямую обращаться к user information database .

Delphi: как вы автоматически обновляете свои приложения? [закрытый]

Я думал о сворачивании моего собственного кода, чтобы позволить моему приложению Delphi легко обновляться, поскольку я буду использовать менталитет «выпускать часто, выпускать раньше». Существуют различные решения Delphi (как бесплатные, так и платные), и я хотел бы спросить, используете ли вы их или просто продолжаете использовать свои собственные решения в этой области. Любые комментарии по теме автоматического обновления приветствуются.

10 ответов

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

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

вы должны решить, можно ли предположить, что ваша целевая аудитория будет работать на учетных записях power user или administrator, или вам придется иметь дело с вышеупомянутыми проблемами. С Vista все стало значительно сложнее.

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

какую бы схему вы ни использовали, может быть удобно знать, что вы действительно можете переименовать запуск .файл EXE. Итак, переименуйте файл, скопируйте в новый файл. И в следующий раз, когда кто-то запустит программу, они запустят новую версию. Это, конечно, очень удобно в среде, где многие пользователи работают одинаково .exe-файл, как в случаях citrix / terminal server / network share.

Я использую Синапс процедуры GetHTTP для возврата определенного ресурса, и если найдено, то проверьте локальную систему, чтобы увидеть, требуется ли обновление. Если это так, то ресурс говорит мне, какую страницу нужно запустить, и я бросаю URL-адрес в оболочку, чтобы пользователи отобразится предпочтительный браузер.

большую часть времени загрузка-это программа установки, созданная InnoSetup, которая обновляет систему пользователей и базу данных до последней версии. Когда новый » платный» обновление необходимо, затем я отправляю пользователя в форму «обновление покупки». Мои веб-ресурсы-это страницы ASP, поэтому я могу перенаправить на другой ресурс на основе номера версии customers.

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

Я создал свое собственное решение тоже на основе Indy для загрузки и http://sourceforge.net/projects/makeupdate/ для исправления файлов. До этого я использовал и пробовал несколько коммерческих инструментов, но никто не делал именно то, что мне нужно.

Я использую TmxWebUpdate. Это бесплатно, просто и дает вам хороший контроль над процессом. Я действительно владею пакетом компонентов TMS с TWebUpdate, но никогда не находил веской причины для переключения.

Edit: ссылка обновлена

обычно мы используем сторонний инструмент. Но в некоторых ситуациях он не использовался, поэтому я создал собственное решение, которое было довольно стандартным:

  • получить xml (или любой другой формат) с информацией об обновлении.
  • если новые файлы опубликованы, загрузите и установите их.

Я использую TWebUpdate . Он работает нормально и имеет массу интересных опций, но документация не так велика, и я столкнулся с несколькими проблемами — поэтому я загружаю полный установщик, а не только файлы.

Я буду следить за этим вопросом, кстати.

мы также свернули наши собственные. Это действительно не слишком сложно.

наш процесс идет что-то вроде:

при запуске основного приложения он проверяет (используя функции из библиотеки synapse), доступно ли обновление (при условии, что оно настроено для проверки, конечно).

Если это так, он уведомляет пользователя и спрашивает, если они хотят обновить.

Если они это сделают, он запускает обновление .exe и закрывает главное приложение.

апдейтер ехе загружает новые файлы на основе содержимого текстового файла он извлекает, keepiing файлы в.

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

наконец, он запускает главное приложение снова и закрывается.

хитрость w / Vista заключается в том, что вам нужно иметь запись в манифесте программы обновления, чтобы заставить ее работать с правами администратора.

мы используем наше собственное решение, которое следует за этими шагами:

  1. приложение подключается к HTTP-ресурсу и загружает информационный файл (ini-текстовый файл) в память, проверяет номер версии новейшей версии.
  2. если имеется более новая версия, приложение загружает сжатый двоичный пакет в месте, exe-файла.
  3. когда загрузка завершена, пользователю предлагается перезапустить приложение.
  4. при запуске, приложение проверяет наличие пакета обновлений
  5. App извлекает содержимое пакета (обычно новое приложение exe, но возможны и дополнительные ресурсы, например, обновленные языковые файлы и т. д.)- для каждого файла он сначала переименовывает текущий / старый файл во временное имя, а затем извлекает новый файл. Если процесс завершается неудачно в любой момент, временные файлы восстанавливаются.
  6. когда закончите, приложение выполняет новый exe и закрывается.

нет необходимости в дополнительном обновлении, приложение exe может справиться с этим самостоятельно.

для сжатого пакета мы используем собственный конструктор обновлений. Пакет содержит индекс файлов с хэш файла, папку назначения (относительный путь к основному exe) и сжатые файлы. Во время обновления мы сравниваем сохраненный хэш с извлеченным файлом для обнаружения corupted файлов.

С Vista я вижу два решения для включения стандартных учетных записей пользователей для фактического обновления файлов приложений:

настройки изменить разрешения каталога установки программ. Таким образом, файлы в «C:\Program файлы (x86)\Your Company\You App» могут быть изменены на аккаунтах с ограниченными правами.

пример кода для InnoSetup будет:

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

Так же, как» stg «и» GuyWithDogs», я использую TWebUpdate из TMS. Хотя документация не так велика, ее не так сложно изучить.

с TWebUpdate, у вас есть несколько вариантов, какой протокол вы используете, это может быть сделано через HTTP, FTP или доступ к сети.

для уровня связи TWebUpdate использует WinInet. На некоторых машинах кэш URL-адресов windows / IE может быть разочаровывающим, поэтому я добавил процедуру для очистки адреса сервера автоматического обновления из кэша сначала в убедитесь, что информация, собранная с сервера, актуальна.

Delphi как программе обновить саму себя

Если похожая тема поднималась прошу сильно не пинать.

Встала проблема автоматического обновление программы з сервера, хочу чтоб подсказали ошибки в моем представлении алгоритма.

Итак:
1. Программа связывается с сервером и читает файл(БД) на сервере на предмет наличия обновлений
2. Сверяется текущая версия с той что лежит на сервере
3. Если доступно обновление программа запускает некий исполняемый (назовем его update.exe) файл
4. Программа закрывается
5. update.exe скачивает все обновления (папки, файлы и т.д.) с сервера и заменяет текущие файлы
6. update.exe запускает программу
7. update.exe закрывается

Я проще делал.
1. В потоке создаю http соединение
2. Открываю на сервере txt файл, по сути просто ini file, в котором я читаю секцию и получаю те файлы, которые я хочу обновить
3. Качаю обновление
4. Разархивирую (сжато zlib)
5. Беру хэндл программы, закрываю его, на лету меняю *.exe программы, старый переименовываю в *.bak, если он нуждаеться в обновлении, остальные файлы, если открыты, то закрываю и тоже обновляю
6. После копирования вывожу мессагу, что мол надо перезапустить программу. Можно отказаться даже, программа все равно работать будет, так как она в памяти весит.

Добавлено 06.12.11, 13:43
И никаких апдатеров и т.д.

по сути это почти тот же вариант что я предложил в первом посте, за исключение потока и переименования файла "на лету"

Буду думать как лучше.

Всем спасибо за ответы!

Ну это от тебя зависит, у меня поверх ставится с обновлением версии, при желании можно и копию сварганить.
Тут просто есть нюанс в том, что если делать изменения в Program Files (куда доступ на запись без поднятия привилегий запрещен), то легальный сетапер не создаст проблем и обновит все как требуется (бо он сам затребует на старте повышения).
Если же обновлять руками (ну за исключением того случая что программа уже работает в Elevate режиме, что по сути нонсенс для обычного ПО) — то будет отлуп.

Читать:
Как подключить наушники в разъем для микрофона

Добавлено 06.12.11, 14:44
ZBugZ, проясни момент:

Добавлено 06.12.11, 15:59

Запущенную программу (старую версию) уже можно куда хочешь девать, хоть удалять. Т.е. программа когда она запущена, уже не привязана к своему *.exe, который обновили.
Далее просто прошу перезапустить и туапо делаю shellexecute новому *.exe

Я делал это именно так, потому что не хотел, а на тот момент и не умел, использовать ресурсы или другие файлы и т.д. и что бы была стабильность в защищенном режиме windows 7
В моем варианте, я тестил с включенным на полную UAC, реакции на это полный ноль. Windows даже не ругнулся. А вот на запуск внешней программы иногда ругался, было это давно уже, когда я тестил, так что нюансов не помню.

Delphi как программе обновить саму себя

Как правильно выполнить перезапуск программы?
Цель такая: нужно обновить программу.
Алгоритм такой: программа скачивает обновление, проверяет на валидность, обозначает как-то что доступно обновление (например пишет ключ в реестр) и перезапускает себя (как firefox, например). При запуске программа проверяет ключ в реестре, и, если доступно обновление — заменяет файлы новыми и дальше работает в штатном режиме.

Остается два узких места: как обновить сам exe-шник?
и как организовать перезагрузку?

но если первую проблему можно как-то обойти: сам exe-шник представляет из себя лоадер, который умеет обновлять основную программу и загружать ее и сам не обновляется. А во-вторых, его можно переименовать во время работы и записать новую версию (не знаю только всегда и везде ли это будет работать?),
то со второй что-то никак не справиться.

Подскажите пожалуйста, как решить данную проблему или укажите как правильно делают обновления программ. Не обязательно подробно объяснять, главное дать пинок в нужном направлении
Заранее благодарен.

От: misha_irpen
Дата: 28.04.08 11:29
Оценка:

Системы семейства NT позволяют переименовать исполняемый файл даже если он сейчас загружен. Можно плясать от этого (простейший способ потребует записи ключика в RunOnce и перезагрузки машины).

А вообще я бы написал маленький екзешничек без использования VCL, сжал его UPX-ом и вложил в ресурс оновного исполняемого файла программы (добавит всего килобайт 10 к размеру). После загрузки обновления, отпочковываем от себя этот файлик, запускаем его с нужными параметрами, а сами завершаемся. Файлик же, дожидается нашего завершения, выполняет обновление всего что нужно, снова запускает программу с «секретным» параметром и тихо завершается. Программа при запуске с этим параметром первым делом дожидается завершения загрузчика, удаляет его и дальше работает как обычно.

Можно ничего не прятать, а просто держать этот загрузчик все время в каталоге программы, но тогда его самого обновить будет сложнее (это должна будет сделать сама программа перед его запуском).

От: BDEsoft
Дата: 28.04.08 11:29
Оценка:

Здравствуйте, bsigr, Вы писали:

Я бы сделал следующим образом.
Первый exe (лоадер) запускает основную программу, и не закрывается, ожидает сообщения. Сама программа, уловив, что нужно обновление, выдает сообщение об этом, посялает сообщение лоадеру (типа мол нужно обновить) и сама закрывается. Лоадер, же скачивает обновления и заного запускает программу. Просто и ясно.

От: Rius
Дата: 28.04.08 14:38
Оценка:

Здравствуйте, bsigr, Вы писали:

B>Как правильно выполнить перезапуск программы?
B>Цель такая: нужно обновить программу.
B>Алгоритм такой: программа скачивает обновление, проверяет на валидность, обозначает как-то что доступно обновление (например пишет ключ в реестр) и перезапускает себя (как firefox, например). При запуске программа проверяет ключ в реестре, и, если доступно обновление — заменяет файлы новыми и дальше работает в штатном режиме.

B>Остается два узких места: как обновить сам exe-шник?
B>и как организовать перезагрузку?

B>но если первую проблему можно как-то обойти: сам exe-шник представляет из себя лоадер, который умеет обновлять основную программу и загружать ее и сам не обновляется. А во-вторых, его можно переименовать во время работы и записать новую версию (не знаю только всегда и везде ли это будет работать?),
B>то со второй что-то никак не справиться.

B>Подскажите пожалуйста, как решить данную проблему или укажите как правильно делают обновления программ. Не обязательно подробно объяснять, главное дать пинок в нужном направлении
B>Заранее благодарен.
У меня работало так:

прога (exe), запускаясь, смотрит из какого каталога она запущена или в каком домене. если не из временного и не в домене, то копирует свой exe во временный каталог и запускает его, сама закрывается (это безоконная прога).

запустившись из временного каталога, прога создаёт домен приложения, включает его кеширование и загружает в него свой исходный exe из исходного каталога. кеширование позволяет программе самой перезаписывать свои файлы после того как они загружены.

загрузившись в домене, прога создаёт класс, создающий уже основное окно приложения из dll. таким образом exe’шнику не требуются остальные dll до этого момента, он имеет минимум кода и малый объём.
этот класс также ждёт здесь выхода из программы, после выхода проверяет, не установлен ли флаг перезапуска программы, и если установлен — вызывает функцию Application.Restart().

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

Delphi как программе обновить саму себя


Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке — https://slurm.club/3MeqNEk

Как сделать автоматическое обновление программы на новую версию?

У меня программа автоматически проверяется на версию. Возможно ли такое, чтоб в случае новой версии она автоматически скачивала бы новую и заменялась на неё? Если да, то как? Подскажите, пожалуйста.

Manitikyl's user avatar

Это, конечно же, возможно. Раз это вопрос новичка в Delphi, то постараюсь ответить доходчиво, как такое реализовать.

  • Для начала вам нужно завести хостинг или аккаунт на каком-л. облачном хранилище. Это необходимо для того, чтобы программа имела в сети «свой уголок», откуда могла бы проверять новую версию и самообновляться в случае появления новой. Лично я вам советую заводить именно хостинг, нежели пользоваться услугами «облаков», так как у этих облачных хранилищ очень ограничена пропускная способность канала, а если пользователей у вашей «программы» будет очень много, то аккаунт забанят из-за большого трафика. Пользуйтесь хостингом.
  • Далее вам надо создать на этом хостинге файлик, в котором будет лежать текущая(последняя) версия вашего «продукта». Например, 1.72.. И еще, конечно же, на хостинг надо поместить «свежую» версию вашего «продукта», чтобы можно было её скачать.

Далее в самой программе вы должны каждый раз при запуске проверять версию из того файла на хостинге, который содержит версию. В самой программе, естественно, должна быть константа, содержащая номер версии программы. Это можно сделать с помощью TIdHttp с панели IndyClients. Если версия больше, то качаем новую(расположена на нашем хостинге.

Качать новую версию лучше всего из «вспомогательной» програмки, прилагаемой к основному файлу вашего «приложения». В случае обнаружения новой версии запускаем updator и он уже все сам сделает.

Delphi как программе обновить саму себя

Евгений Бабенко
дата публикации 31-05-2005 04:41

У администраторов — программистов, которые впервые сталкиваются с подобной проблемой, первое желание — заставить программу саму себя обновлять. Это законное желание. Нет промежуточного программного обеспечения, которое, в свою очередь, необходимо администрировать. Проблема в том, что программа не может удалить сама себя. В свое время, столкнувшись с этой проблемой, мы у себя на предприятии решили эту проблему стандартным способом — скриптами. А недавно я обнаружил интересную особенность ОСей и сделал это способом, максимально приближенным к «идеалу».

В обоих случаях, для ускорения закачки файла с сервера, программы были перекомпилированы с использование Runtime Packages и после этого упакованы упаковщиком Exe — файлов. В итоге размеры полученных файлов не превышал 300 К.

Способ №1. Обновление с помощью VB скрипта.

Создаем на сервере папку с доступом для группы пользователей, использующих наши программы. Например \\Server1\ExeLib$ (приставка с $ позволит скрыть папку из сетевого окружения. Для того, чтобы не привязываться к конкретному имени сервера, мы создали линк с помощью Distributed File System (Dfs) : \\VirtualServer\ExeLib. Теперь физическое местоположение программ не имеет значение. При падении сервера мы просто копируем папку на другой сервер и делаем соответствующие изменения в Active Directory. Или это делает наш администратор домена. В папку ExeLib складываем exe-файлы. Там же создаем папку VBS, в которую поместим наши скрипты. Для каждого exe — файла свой скрипт. Вот пример скрипта:

Скрипт проверяет дату последнего изменения exe — файла. Если файл локально не существует или на сервере лежит более новый файл, скрипт копирует файл на клиентский компьютер. После этого программа запускается на выполнение. На клиенте все наши программы должны лежать в одной папке. Желательно на диске C:, т.к. в домене могут встречаться машины с дисками малого размера. Для WinNt4 необходимо проверить наличие WScript.exe. У клиентов должны быть права на запуск WScript.exe. Скрипт запускается из папки \\VirtualServer\ExeLib\VBS, т.е. сервера. Это позволит нам легко модифицировать скрипт и не заботиться об обновлении самого скрипта. Например, добавить код для вызова другого скрипта, в котором мы прописываем обновление bpl — файлов.

Способ №2. Обновление программы самой программой.

Если вы запустите программу и после этого попытаетесь переименовать exe — файл, никаких возражений со стороны операционный системы не последует. Программа после такой операции продолжает работать без видимых проблем. Я, во всяко случае, проблем не обнаружил. Этот факт и используется в коде, приведенном ниже.

  1. Проверяем наличие bak файла, который мог остаться от предыдущего обновления и если находим — удаляем.
  2. Сравниваем дату изменения локального файла и файла, находящегося на сервере.
  3. Если необходимо обновление — копируем файл с сервера в файл «bak1». Еще один промежуточный файл используется для уменьшения вероятности нарваться на сбой в программе, когда у нас не окажется в папке файла с оригинальным названием.
    1. Переименовываем оригинал в файл с расширением «bak» .
    2. Восстанавливаем оригинал из файла «bak1»

    Далее — на любителя. Можно попытаться предупредить пользователя и заставить его перезапустить программу. Или оставить все, как есть. Этот способ проверен на WinNt4 и Win2000. Прав особых пользователям не надо.

    Обсуждение материала [ 29-08-2008 07:23 ] 21 сообщение

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

Related Posts