Delphi как программе обновить саму себя
Я делал через idHTTP. Получаешь файл обновлений с сервера:
var ustream:TMemoryStream; begin ustream:=TMemoryStream.Create; idHttp.Get('http://mysite.ru/update.xml',ustream); xml.LoadFromStream(ustream); // дальше анализируешь и скачиваешь файлы, путь которых записан в узлах XML ustream.Free; end;
Скачивание файлов также через idHttp.Get;
Последний раз редактировалось kettanaito; 12.12.2011 в 23:44 .
| kettanaito |
| Посмотреть профиль |
| Найти ещё сообщения от kettanaito |
Пользователь
Регистрация: 16.01.2011
Сообщений: 65
Нашел в одной из тем такой код:
procedure TForm1.Button1Click(Sender: TObject); var v:string; begin v:=HTTP.Get('http://адрес вашего сайта/update/version.txt'); if v=version.Caption then showmessage('Вы используете последнюю версию программы!') else begin ftp.Connect(true); if ftp.connected then begin ftp.ChangeDir('update'); ftp.Get('Project.exe',extractfilepath(application.ExeName)+'\project.exe',true); end; ftp.Disconnect; showmessage('ok'); end; end; end.
Все работает до места скачивания обновленной проги, вылазит что не может изменить директорию, вроде все сделал правильно. Что делать??
Delphi как программе обновить саму себя
Евгений Бабенко
дата публикации 31-05-2005 04:41
Обновление программы самой программой Условия работы: Локальная сеть(Win2000, WinNt4), сервер СУБД (Oracle, SQL Server . ), множество клиентов, работающих с базой. Постановка задачи: Автоматическое обновление программы клиента при внесении каких либо изменений в эти программы.
У администраторов — программистов, которые впервые сталкиваются с подобной проблемой, первое желание — заставить программу саму себя обновлять. Это законное желание. Нет промежуточного программного обеспечения, которое, в свою очередь, необходимо администрировать. Проблема в том, что программа не может удалить сама себя. В свое время, столкнувшись с этой проблемой, мы у себя на предприятии решили эту проблему стандартным способом — скриптами. А недавно я обнаружил интересную особенность ОСей и сделал это способом, максимально приближенным к «идеалу».
В обоих случаях, для ускорения закачки файла с сервера, программы были перекомпилированы с использование Runtime Packages и после этого упакованы упаковщиком Exe — файлов. В итоге размеры полученных файлов не превышал 300 К.
Способ №1. Обновление с помощью VB скрипта.
Создаем на сервере папку с доступом для группы пользователей, использующих наши программы. Например \\Server1\ExeLib$ (приставка с $ позволит скрыть папку из сетевого окружения. Для того, чтобы не привязываться к конкретному имени сервера, мы создали линк с помощью Distributed File System (Dfs) : \\VirtualServer\ExeLib. Теперь физическое местоположение программ не имеет значение. При падении сервера мы просто копируем папку на другой сервер и делаем соответствующие изменения в Active Directory. Или это делает наш администратор домена. В папку ExeLib складываем exe-файлы. Там же создаем папку VBS, в которую поместим наши скрипты. Для каждого exe — файла свой скрипт. Вот пример скрипта:
Dim fs, f1, f2 Dim WshShell const SPatch = "\\VirtualServer\ExeLib\" 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. Скрипт запускается из папки \\VirtualServer\ExeLib\VBS, т.е. сервера. Это позволит нам легко модифицировать скрипт и не заботиться об обновлении самого скрипта. Например, добавить код для вызова другого скрипта, в котором мы прописываем обновление 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:='\\VirtualServer\ExeLib\+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.
Функция может не работать в некоторых версиях броузеров.© При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
Все используемые на сайте торговые марки являются собственностью их производителей.Как сделать автоматическое обновление программы на новую версию?
У меня программа автоматически проверяется на версию. Возможно ли такое, чтоб в случае новой версии она автоматически скачивала бы новую и заменялась на неё? Если да, то как? Подскажите, пожалуйста.
Отслеживать
371 1 1 золотой знак 5 5 серебряных знаков 13 13 бронзовых знаков
задан 9 июл 2012 в 10:07
9,194 4 4 золотых знака 24 24 серебряных знака 47 47 бронзовых знаков3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Это, конечно же, возможно. Раз это вопрос новичка в Delphi, то постараюсь ответить доходчиво, как такое реализовать.
- Для начала вам нужно завести хостинг или аккаунт на каком-л. облачном хранилище. Это необходимо для того, чтобы программа имела в сети «свой уголок», откуда могла бы проверять новую версию и самообновляться в случае появления новой. Лично я вам советую заводить именно хостинг, нежели пользоваться услугами «облаков», так как у этих облачных хранилищ очень ограничена пропускная способность канала, а если пользователей у вашей «программы» будет очень много, то аккаунт забанят из-за большого трафика. Пользуйтесь хостингом.
- Далее вам надо создать на этом хостинге файлик, в котором будет лежать текущая(последняя) версия вашего «продукта». Например, 1.72.. И еще, конечно же, на хостинг надо поместить «свежую» версию вашего «продукта», чтобы можно было её скачать.
- Далее в самой программе вы должны каждый раз при запуске проверять версию из того файла на хостинге, который содержит версию. В самой программе, естественно, должна быть константа, содержащая номер версии программы. Это можно сделать с помощью TIdHttp с панели IndyClients. Если версия больше, то качаем новую(расположена на нашем хостинге.
- Качать новую версию лучше всего из «вспомогательной» програмки, прилагаемой к основному файлу вашего «приложения». В случае обнаружения новой версии запускаем updator и он уже все сам сделает.
- Что будет делать апдейтор? Он, в случае обнаружения новой версии, будет закрывать основное «приложение», скачивать новое(Как? Это вам должно быть известно.) и копировать его вместо старого. Скачанный файл потом надо будет удалить.
Отслеживать
371 1 1 золотой знак 5 5 серебряных знаков 13 13 бронзовых знаков
ответ дан 9 июл 2012 в 10:21
13.6k 13 13 золотых знаков 62 62 серебряных знака 122 122 бронзовых знака@Yura Ivanov, ну большинство этих «вещиц» можно сделать «динамически изменяемыми». Так, например, можно на хостинге создать файл параметров, где будет вся инфа по подключению к БД, прочим серверам, если надо и т.д. — А вообще, раз уж так может понадобиться обновлять апдейтор, то можно просто «схитрить» и сделать «взаимное обновление». То есть, например, при надобности основное приложение обновит тот апдейтор, а тот, в свою очередь, будет обновлять само приложение. Вариант здесь не один, на самом деле =)
9 июл 2012 в 11:42
чем больше компонент, тем сложнее становится система. в итоге превращается в слипшиеся макароны. идите сразу простым путем. некоторые ваще не парятся по поводу автообновлений, хотите новую версию — качайте, ставьте руками.
9 июл 2012 в 11:50
Судя по вопросам, ТС пишет не вирус, а что-то типа «калькулятор», но со всеми возможными и невозможными примочками — и автообновление и прятание в трей, скоро появятся вопросы про круглую форму/кнопку, таскание формы за любую область окна и т.д. В итоге программа будет скорее всего бесполезной, но в ней будет все остальное.
9 июл 2012 в 12:11
@Хэшкод, Опять кто-то мои комментарии потер. О чем речь теперь можно только догадываться.
11 июл 2012 в 10:50@Yura Ivanov, этим занимается Asen, потому как критика сильно уязвляет нашего специалиста по безопасности. Например, нельзя смеяться над след. волшебной фразой: > Mozilla FireFox, например, умеет обходить UAC, используя один из его многочисленных багов — переполнение буфера
Delphi как программе обновить саму себя
судя по всему, то, что предложил bitSoft — то, что надо. (не знаю, как там с платностью компоненты, но TMS грамотная и известная фирма.
хочу от себя добавить.
Программа запускается, качает обновление и, по идее, переписывается поверх. Но прога запущена и не дает затереть исполняемый файл. Надо как-то закрыться, переписать и вновь запуститься что ли. если проблема только в том, чтобы заменить запущенный EXE файл, то решение через BAT файл отлично решит данную проблему. Либо, сделать это так, как это делают многие программы (Adobe Acrobat Reader, например) — в комплект программы входит независимый exe файл, например, update.exe. Программа запускает его для проверки обновления. Если обновление есть — то этот самый update.exe выкачивает обновление (с временным именем), закрывает запущенный основной файл, заменяет основной exeшник, и прекращает работу.
Serge_Bliznykov Посмотреть профиль Найти ещё сообщения от Serge_Bliznykov