Для автоматического обновления приложения в Delphi можно использовать следующий алгоритм:
1. Добавьте в проект функцию, которая будет производить проверку наличия новой версии программы на сервере. Для этого можно использовать функции работы с сетью в Delphi, например, компонент TIdHttp из библиотеки Indy.
2. Если обнаружена новая версия, скачайте ее с сервера во временный каталог.
3. Проверьте загруженный файл на целостность и правильность.
4. Если загруженный файл корректен, установите новую версию программы, перезапустив ее.
Приведу пример кода для реализации автоматического обновления:
uses
System.SysUtils, System.Classes, IdHTTP, IdGlobal, IdSSLOpenSSL;
type
TUpdater = class(TThread)
private
FHttp: TIdHTTP;
FTempDir: string;
FTempFile: string;
FExecutable: string;
FVersion: string;
FNewVersion: string;
FUpdateUrl: string;
FUpdateAvailable: Boolean;
procedure CheckForUpdates;
Обновление программы Delphi
protected
procedure Execute; override;
public
constructor Create;
destructor Destroy; override;
property UpdateAvailable: Boolean read FUpdateAvailable;
end;
const
cAppVersion = ‘1.0’;
constructor TUpdater.Create;
begin
inherited Create;
FHttp := TIdHTTP.Create;
FHttp.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(FHttp);
FTempDir := ExtractFilePath(ParamStr(0)) + ‘temp’;
FTempFile := FTempDir + ‘update.zip’;
FExecutable := ParamStr(0);
FVersion := cAppVersion;
FUpdateUrl := ‘https://example.com/update/’;
end;
destructor TUpdater.Destroy;
begin
FHttp.IOHandler.Free;
FHttp.Free;
inherited;
end;
procedure TUpdater.CheckForUpdates;
begin
FNewVersion := FHttp.Get(FUpdateUrl + ‘version.txt’);
if FNewVersion <> FVersion then
begin
FHttp.Get(FUpdateUrl + ‘update.zip’, FTempFile);
// TODO: check for file integrity
FUpdateAvailable := True;
end;
end;
procedure TUpdater.Execute;
begin
FUpdateAvailable := False;
try
CheckForUpdates;
except
// Error occurred, don’t update
end;
end;
В этом коде мы создаем класс TUpdater, который наследуется от TThread. В его конструкторе мы создаем объект TIdHTTP из библиотеки Indy, который мы будем использовать для обмена данными с сервером. Кроме того, мы указываем путь к временному каталогу, имя файла для загрузки и путь к исполняемому файлу.
В методе CheckForUpdates мы отправляем запрос на сервер и получаем версию программы и ссылку на файл обновления. Если новая версия обнаружена, мы загружаем файл обновления во временный каталог.
В методе Execute мы проверяем наличие обновлений при старте программы. Если они есть, то соответствующее свойство UpdateAvailable устанавливается в True.
Затем в методе TForm.FormCreate мы создаем экземпляр класса TUpdater и запускаем его в фоновом режиме.
Хорош ли новый релиз «2018 rev. 0», последняя версия 2021 г. к мультимарочному сканеру Delphi DS150E
procedure TForm1.FormCreate(Sender: TObject);
var
Updater: TUpdater;
begin
Updater := TUpdater.Create;
Updater.Start;
end;
Этот код позволит получать уведомления о наличии обновлений при запуске программы. Вы можете добавить логику, которая будет отображать пользователю соответствующее сообщение и предлагать ему установить обновление.
Например, если свойство UpdateAvailable установлено в True, то мы можем показать сообщение пользователю и спросить, хочет ли он установить обновление:
if Updater.UpdateAvailable then
begin
if MessageDlg(‘New version is available. Do you want to update?’, mtConfirmation, [mbYes, mbNo], 0) = mrYes then
begin
// TODO: initiate update
end;
end;
Для инициирования установки обновления вам нужно выполнить следующие шаги:
1. Остановите работу TUpdater, чтобы вы могли произвести обновление. Например, вы можете послать сигнал остановки потока, например, Updater.Terminate.
2. Распакуйте загруженный файл в каталог, который вы выберете для установки новой версии.
3. Перезапустите программу.
Вот примерный код для распаковки файла:
procedure TForm1.InstallUpdate;
var
Zip: TZipFile;
begin
Zip := TZipFile.Create;
try
Zip.Open(Updater.FTempFile, zmRead);
Zip.ExtractAll(ExtractFilePath(Updater.FExecutable));
finally
Zip.Free;
end;
end;
В этом примере мы используем класс TZipFile из библиотеки System.Zip для распаковки файла. Мы открываем файл обновления в режиме чтения, распаковываем его в каталог, содержащий исполняемый файл, и перезапускаем программу.
Похожие записи:
- Как настроить приложения на автоматическое обновление на Windows?
- Как настроить автоматическое обновление приложения на Android?
- Как отменить автоматическое обновление приложения на Android?
- Как организовать автоматическое обновление справочной информации приложения при непрерывной интеграции и непрерывном развертывании?
- Как можно настроить автоматическое обновление приложения в Spring?
Источник: qaa-engineer.ru
Как сделать обновление программы в delphi
Евгений Бабенко
дата публикации 31-05-2005 04:41
Обновление программы самой программой Условия работы: Локальная сеть(Win2000, WinNt4), сервер СУБД (Oracle, SQL Server . ), множество клиентов, работающих с базой. Постановка задачи: Автоматическое обновление программы клиента при внесении каких либо изменений в эти программы.
У администраторов — программистов, которые впервые сталкиваются с подобной проблемой, первое желание — заставить программу саму себя обновлять. Это законное желание. Нет промежуточного программного обеспечения, которое, в свою очередь, необходимо администрировать. Проблема в том, что программа не может удалить сама себя.
В свое время, столкнувшись с этой проблемой, мы у себя на предприятии решили эту проблему стандартным способом — скриптами. А недавно я обнаружил интересную особенность ОСей и сделал это способом, максимально приближенным к «идеалу».
В обоих случаях, для ускорения закачки файла с сервера, программы были перекомпилированы с использование Runtime Packages и после этого упакованы упаковщиком Exe — файлов. В итоге размеры полученных файлов не превышал 300 К.
Способ №1. Обновление с помощью VB скрипта.
Создаем на сервере папку с доступом для группы пользователей, использующих наши программы. Например \Server1ExeLib$ (приставка с $ позволит скрыть папку из сетевого окружения. Для того, чтобы не привязываться к конкретному имени сервера, мы создали линк с помощью Distributed File System (Dfs) : \VirtualServerExeLib. Теперь физическое местоположение программ не имеет значение.
При падении сервера мы просто копируем папку на другой сервер и делаем соответствующие изменения в Active Directory. Или это делает наш администратор домена. В папку ExeLib складываем exe-файлы. Там же создаем папку VBS, в которую поместим наши скрипты. Для каждого exe — файла свой скрипт. Вот пример скрипта:
Dim fs, f1, f2 Dim WshShell const SPatch = «\VirtualServerExeLib» const DPatch = «C:Client» const SExe = «Prog1.Exe» Set fs = CreateObject(«Scripting.FileSystemObject») Set f1 = fs.getfile(SPatch+SExe) Set WshShell = WScript.CreateObject(«WScript.Shell») If fs.FileExists(DPatch+SExe) Then Set f2 = fs.getfile(DPatch+SExe) If f1.DateLastModified > f2.DateLastModified Then fs.CopyFile SPatch+SExe, DPatch, True End If Else fs.CopyFile SPatch+SExe, DPatch, True End If WshShell.Run (DPatch+SExe)
Скрипт проверяет дату последнего изменения exe — файла.
Если файл локально не существует или на сервере лежит более новый файл, скрипт копирует файл на клиентский компьютер. После этого программа запускается на выполнение. На клиенте все наши программы должны лежать в одной папке. Желательно на диске C:, т.к. в домене могут встречаться машины с дисками малого размера. Для WinNt4 необходимо проверить наличие WScript.exe.
У клиентов должны быть права на запуск WScript.exe. Скрипт запускается из папки \VirtualServerExeLibVBS, т.е. сервера. Это позволит нам легко модифицировать скрипт и не заботиться об обновлении самого скрипта. Например, добавить код для вызова другого скрипта, в котором мы прописываем обновление bpl — файлов.
Способ №2. Обновление программы самой программой.
Если вы запустите программу и после этого попытаетесь переименовать exe — файл, никаких возражений со стороны операционный системы не последует. Программа после такой операции продолжает работать без видимых проблем. Я, во всяко случае, проблем не обнаружил. Этот факт и используется в коде, приведенном ниже.
unit uUpdateApp; interface uses Classes, Windows, SysUtils, Forms; type TUpdateApp=class(TThread) protected procedure Execute; override; end; implementation procedure TUpdateApp.Execute; var iFileName: String; iFileNameBak: String; iFileNameR: String; iLDate, iRDate: TDateTime; begin Sleep(100); iFileName:=Application.ExeName; iFileNameBak:=iFileName+’.bak’; if FileExists(iFileNameBak) then DeleteFile(iFileNameBak); if FileExists(iFileNameBak+’1′) then DeleteFile(iFileNameBak+’1′); iFileNameR:=’\VirtualServerExeLib+ExtractFileName(iFileName); if not FileExists(iFileNameR) then Exit; iLDate:=FileDateToDateTime(FileAge(iFileName)); iRDate:=FileDateToDateTime(FileAge(iFileNameR)); if iLDate>=iRDate then Exit; if not CopyFile(PChar(iFileNameR),PChar(iFileNameBak),false) then Exit; Sleep(1000); if not MoveFile(PChar(iFileName),PChar(iFileNameBak+’1′)) then Exit; Sleep(100); if not MoveFile(PChar(iFileNameBak),PChar(iFileName)) then Exit; Sleep(100); if not MoveFile(PChar(iFileNameBak+’1′),PChar(iFileNameBak)) then Exit; end; initialization TUpdateApp.Create(false); end.
- Проверяем наличие bak файла, который мог остаться от предыдущего обновления и если находим — удаляем.
- Сравниваем дату изменения локального файла и файла, находящегося на сервере.
- Если необходимо обновление — копируем файл с сервера в файл «bak1». Еще один промежуточный файл используется для уменьшения вероятности нарваться на сбой в программе, когда у нас не окажется в папке файла с оригинальным названием.
- Переименовываем оригинал в файл с расширением «bak» .
- Восстанавливаем оригинал из файла «bak1»
Далее — на любителя. Можно попытаться предупредить пользователя и заставить его перезапустить программу. Или оставить все, как есть. Этот способ проверен на WinNt4 и Win2000. Прав особых пользователям не надо.
Обсуждение материала [ 29-08-2008 07:23 ] 21 сообщение
Время на сайте: GMT минус 5 часов
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
Функция может не работать в некоторых версиях броузеров.
Источник: www.delphikingdom.com
Delphi: как вы автоматически обновляете свои приложения? [закрытый]
Я думал о сворачивании моего собственного кода, чтобы позволить моему приложению Delphi легко обновляться, поскольку я буду использовать менталитет «выпускать часто, выпускать раньше». Существуют различные решения Delphi (как бесплатные, так и платные), и я хотел бы спросить, используете ли вы их или просто продолжаете использовать свои собственные решения в этой области. Любые комментарии по теме автоматического обновления приветствуются.
автор: Jason Plank
10 ответов
несколько лет назад я написал простой инструмент, который запускается вместо реальной программы, проверяет наличие обновлений, загружает и устанавливает их (если таковые имеются), и, наконец, начинается настоящее применение.
однако есть проблемы с этим подходом, если ваша программа работает в правильно администрируемой среде, где пользователи обычно не имеют доступа на запись в каталоги программы. Вы больше не можете просто обновлять свою собственную программу в таких средах. Вот почему много программ эти дни приходят с их собственным инструментом updater, который может быть установлен для запуска с повышенными разрешениями, так что обновления программы могут быть применены, даже если только стандартные пользователи когда-либо войти в систему.
вы должны решить, можно ли предположить, что ваша целевая аудитория будет работать на учетных записях power user или administrator, или вам придется иметь дело с вышеупомянутыми проблемами. С Vista все стало значительно сложнее.
со всеми этими проблемами (доступ к сети через прокси, отсутствующие разрешения на запись для каталогов установки, необходимость обновления файлов, которые использует сам updater — просто назвать несколько) я бы не стал пытаться снова кодировать это самостоятельно. Гораздо лучше проверить, делает ли какое-либо из доступных решений все, что вам нужно.
автор: mghie
какую бы схему вы ни использовали, может быть удобно знать, что вы действительно можете переименовать запуск .файл EXE. Итак, переименуйте файл, скопируйте в новый файл. И в следующий раз, когда кто-то запустит программу, они запустят новую версию. Это, конечно, очень удобно в среде, где многие пользователи работают одинаково .exe-файл, как в случаях citrix / terminal server / network share.
Я использую Синапс процедуры GetHTTP для возврата определенного ресурса, и если найдено, то проверьте локальную систему, чтобы увидеть, требуется ли обновление. Если это так, то ресурс говорит мне, какую страницу нужно запустить, и я бросаю URL-адрес в оболочку, чтобы пользователи отобразится предпочтительный браузер.
большую часть времени загрузка-это программа установки, созданная InnoSetup, которая обновляет систему пользователей и базу данных до последней версии. Когда новый » платный» обновление необходимо, затем я отправляю пользователя в форму «обновление покупки». Мои веб-ресурсы-это страницы ASP, поэтому я могу перенаправить на другой ресурс на основе номера версии customers.
для основного приложения (наше приложение имеет серверную часть и клиентскую часть) у меня есть загрузчик, который проверит сервер, чтобы увидеть, отличается ли версия файла клиента на сервере от версии на клиенте. если это так, он запрашивает пользователя, если пользователь хочет обновить/отменить. Мы выберите запрос пользователя, так как иногда случайная ошибка может попасть в систему, и пользователь должен понизить/обновить только определенные машины для устранения неполадок. Я поддерживаю запись базы данных с минимальной требуемой версией, которая обновляется через исправление базы данных, поэтому, если версия должна быть удалена, запись обновляется соответственно.
автор: skamradt
Я создал свое собственное решение тоже на основе Indy для загрузки и http://sourceforge.net/projects/makeupdate/ для исправления файлов. До этого я использовал и пробовал несколько коммерческих инструментов, но никто не делал именно то, что мне нужно.
Я использую TmxWebUpdate. Это бесплатно, просто и дает вам хороший контроль над процессом. Я действительно владею пакетом компонентов TMS с TWebUpdate, но никогда не находил веской причины для переключения.
Edit: ссылка обновлена
автор: vrad
обычно мы используем сторонний инструмент. Но в некоторых ситуациях он не использовался, поэтому я создал собственное решение, которое было довольно стандартным:
- получить xml (или любой другой формат) с информацией об обновлении.
- если новые файлы опубликованы, загрузите и установите их.
автор: Toon Krijthe
Я использую TWebUpdate . Он работает нормально и имеет массу интересных опций, но документация не так велика, и я столкнулся с несколькими проблемами — поэтому я загружаю полный установщик, а не только файлы.
Я буду следить за этим вопросом, кстати.