Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > автомотическое обновлений программы


Автор: Плаха 30.5.2005, 18:26
Подскажите, как можно реализовать автомотическое обновлений программы. Может быт есть какой нибуть готовый модуль или плагин.

Автор: Pakshin A. S. 30.5.2005, 19:03
Это что тебе конкретно нужно? Через нет?

Лично я могу расписать способ "сделай сам" (т. е. без компонентов через прямое обращение к файлам).... smile

Автор: Плаха 31.5.2005, 10:22
распиши если не трудно.

Автор: Akella 31.5.2005, 10:56
мне кажется, что нужно львиную долю кода писать в Dll и уже из программы качать новую Dll, выгружать старую, проверять новую, и загружать новую.

Автор: mvdr 31.5.2005, 12:59
можно сделать файл, в котором хранить инфу типа даты программы, ее номера, или названия всех файлов, используемых в программе. при записи подобной программы (новой) сравнивать 2 файла (которые содержат такую инфу), в результате, если новая программа является новее, то производить перезаписывание. можно поподробнее описать, если заинтересует

Автор: Плаха 31.5.2005, 13:16
Понятно. Спасибо. Буду пробовать

Автор: Snowy 31.5.2005, 14:37
Цитата
автомотическое обновлений программы

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

Автор: mvdr 31.5.2005, 14:50
если что, я могу более подробно рассказать, нежели написал

Автор: z-END 31.5.2005, 15:04
Цитата(Femida @ 31.5.2005, 13:59)
можно сделать файл, в котором хранить инфу типа даты программы, ее номера, или названия всех файлов, используемых в программе. при записи подобной программы (новой) сравнивать 2 файла (которые содержат такую инфу), в результате, если новая программа является новее, то производить перезаписывание. можно поподробнее описать, если заинтересует

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

Автор: mvdr 31.5.2005, 15:07
z-END, я не для сервера, а для случая без него.

Автор: z-END 31.5.2005, 15:17
Femida а откуда тогда обновление? (тем более автоматическое)
моя не понимать smile

Автор: Snowy 31.5.2005, 15:36
Код

var
  sl: TStringList;
begin
  sl:=TStringList.Create;
  sl.Add(':start');
  sl.Add('del "'+ParamStr(0)+'" >nul');
  sl.Add('if Exist "'+ParamStr(0)+'" goto start');
  sl.Add('copy Новый_файл.exe "'+ParamStr(0)+'"');
  sl.Add('"'+ParamStr(0)+'"');
  sl.Add('del %0 >nul');
  sl.SaveToFile('$$tmp$$.bat');
  WinExec('$$tmp$$.bat',SW_HIDE);
  Application.Terminate;
end;

Автор: mvdr 31.5.2005, 16:29
z-END, есть программа. потом автор выпускает новую, ты скачиваешь ее. и ставишь себе - и вот тебе и проверка

Автор: z-END 31.5.2005, 16:38
Femida smile круто... допустим у меня есть КульСофт 2.0 я скачиваю с сайта КульСофт 1.0 и конечно-же я подумаю что это более новая версия..
какая проверка?! версии приложений как раз для этого и существуют чтобы юзеры (ламеры и прочие) могли понять где что новееsmile

ЗЫ и в каком-же месте тогда здесь "автоматическое обновление" ? юзер автоматически при выходе в инет делает-чтоли? smile

Автор: mvdr 31.5.2005, 17:03
z-END, ладно, но номер ничего не говорит. Допутим: СуперЛамер выбирает ОС. Он видит: 95, 98, 2000, потом идет Me,XP .Откуда ему знать, что ХР это самая последняя из представленных? У него стоит ХР, Он ставит Винду 2000, а ему и говорят: что ваша 0С новее

Автор: z-END 31.5.2005, 17:08
Femida открою тебе секрет, что даже у виндовс ХП есть версия, и она выше чем у 95, 98, 2000, МЕ, щелкни правой мышкой на "мой компутер" и выбери свойства и посмотри вкладку "общие" smile)
Добавлено @ 17:09
Но вообще согласен, ситауцая такая возможна.. но по одной причине - нерадивые разработчики софтаsmile

Автор: mvdr 31.5.2005, 17:13
Это не секрет smile
ведь драйвера оповещают каким то образом?! (но некоторые, сволочи нет)

Автор: Snowy 31.5.2005, 17:38
Вот, нарисовал процедурку обновления с инета.
Для ее работы требуется, чтобы было подключение к инету.
Хотя... И без него не должно сглючить.
Код

procedure InetUpdate;
const
  url='http://www.mysite.ru/myprog.exe'; // откуда качать новую версию
  lm='last.ver'; // Файл, где храним дату последнего обновления
  tmp='temp.exe'; // временный файл, куда скачать новую версию
  bat='$$tmp$$.bat'; // временный батник
var
  http: TIdHttp;
  s,t:  string;
  m:    TMemoryStream;
  sl:   TStringList;
begin
  sl:=TStringList.Create;
  m:=TMemoryStream.Create;
  try
    sl.LoadFromFile(lm); // читаем из файла нашу дату
    t:=sl[0];
  except t:='-'; end;
  http:=TIdHttp.Create(nil);
  http.Head(url); // спрашиваем, какая дата у файла в инете
  s:=http.Response.RawHeaders.Values['Last-Modified'];
  if s<>t then // если в инете другая - закачать
    try
      // ShowMessage('Есть новая версия');
      http.Get(url,m); // закачать
      m.SaveToFile(tmp); // сохраняем во временный файл
      m.Position:=0;
      // ShowMessage('Готов к обновлению');
      sl.Clear;
      sl.Add(s);
      sl.SaveToFile(lm); // обновляем дату в файле с датой
    finally
      http.Free; m.Free;
    end;
  if FileExists(tmp) then begin // если есть новый файл, делаем батник
    sl.Clear;
    sl.Add(':start');
    sl.Add('del "'+ParamStr(0)+'" >nul');
    sl.Add('if FileExist "'+ParamStr(0)+'" goto start');
    sl.Add('copy '+tmp+' "'+ParamStr(0)+'"');
    sl.Add('del '+tmp+' >nul');
    sl.Add('"'+ParamStr(0)+'"');
    sl.Add('del %0 >nul');
    sl.SaveToFile(bat);
  end;
  sl.Free;
  if FileExists(bat) then begin // если есть батник, стартуем замену себя
    WinExec(bat,SW_HIDE);
    Application.Terminate;
  end;
end;

P.S. Сам не проверял, но работать должно.
P.P.S. Вопрос с прокси решайте уже сами.
P.P.P.S. Почему дату храню в отдельном файле? А потому, что мне нужно хранить ее в том же виде, какой выдает сервер. А разные сервера оформляют строку по разному.

Автор: Гость_Юра 31.5.2005, 18:36
Вот еще вопрос, может конечно не в тему(тогда сории smile

Например я сделал прогу версии 1.2.0 в ней оказался большой глюк(например "if ... then" забыл поставить коегде) и я быстро сделел версию 1.2.1 без глюка. И выложил новую версию. Но exe'шник моей проги весть 2,5 mb и юзеру качать каждый раз 2,5 метра просто влом(или дорого). Как бы сделать такую маленькую прожку(патч) которая бы "превращала" прогу версии 1.2.0 в 1.2.1.

Автор: z-END 31.5.2005, 18:44
в JEDI есть для этого компонет. или пиши сам, смысл патча я писал выше

Автор: Гость_Юра 31.5.2005, 19:02
Подкить пример использования Джедаевскоко(JEDI) компонента, а то я сёдня туплю.

Автор: Snowy 1.6.2005, 09:22
У Кладова есть утилитка, которая делает маленький патч.
Как раз для таких целей, когда поменялся не байтик в коде, а сменилась версия..
Если сходить на страницу KOL (http://bonanzas.rinet.ru/) , там найдешь.
(http://bonanzas.rinet.ru/updater.zip - GUI версия)
(http://bonanzas.rinet.ru/CUpdater.zip - консольная версия)

Автор: Неназываемый 2.6.2005, 18:25
А я просто дистрибутив сделал с BPL а обновляется ASPack'нутый сжатый экзешник. У меня 40 кб. Я думаю это не много даже для диал аперов.

Автор: MacTep 8.2.2007, 11:49
Snowy, можно небольшое пояснение по твоему коду??? Что-то не догоняю, что здесь и к чему?
Код

var
  sl: TStringList;
begin
  sl:=TStringList.Create;
  sl.Add(':start');
  sl.Add('del "'+ParamStr(0)+'" >nul');
  sl.Add('if Exist "'+ParamStr(0)+'" goto start');
  sl.Add('copy Новый_файл.exe "'+ParamStr(0)+'"');
  sl.Add('"'+ParamStr(0)+'"');
  sl.Add('del %0 >nul');
  sl.SaveToFile('$$tmp$$.bat');
  WinExec('$$tmp$$.bat',SW_HIDE);
  Application.Terminate;
end;

Автор: Rodman 8.2.2007, 11:54
Код

var
  sl: TStringList;
begin
  sl:=TStringList.Create;
  sl.Add(':start'); //создание лэйбла
  sl.Add('del "'+ParamStr(0)+'" >nul');// удаление программы источника (старой)
  sl.Add('if Exist "'+ParamStr(0)+'" goto start');// проверка на удаление
  sl.Add('copy Новый_файл.exe "'+ParamStr(0)+'"'); // переименовка нового имени на старое
  sl.Add('"'+ParamStr(0)+'"'); // запуск новой версии
  sl.Add('del %0 >nul'); // удаления bat (сам себя)
  sl.SaveToFile('$$tmp$$.bat');// создание bat
  WinExec('$$tmp$$.bat',SW_HIDE); //запуск
  Application.Terminate;
end;

Автор: MacTep 8.2.2007, 12:02
Rodman, спасибо, сейчас попробую. smile Если работает, сразу плюс тебе в репутацию. smile

Автор: Snowy 8.2.2007, 12:13
А куда оно денется.
Проверено не один десяток раз smile

Автор: Rodman 8.2.2007, 12:16
я тоже его когда то реализовал... по этому примеру.

Автор: MacTep 8.2.2007, 12:46
Странно, но не работает. Как будто исходный файл просто не удаляется... Не понимаю, что такое...

Добавлено @ 12:50 
Извините, работает. smile Но... Если в названиях папок, в которой лежат эти два файла (старая прога и новая) встречаются русские символы или пробелы - все, прога не работает. Что делать? с этим можно как-то бороться?

И странно так: не работает удаление новой версии файла... странно... она же в конце удалиться должна.... как реализовать - не понятно...

Автор: Snowy 8.2.2007, 13:04
Код

var
  sl: TStringList;
  s:  string;
begin
  sl:=TStringList.Create;
  sl.Add(':start');
  sl.Add('del "'+ParamStr(0)+'" >nul');
  sl.Add('if Exist "'+ParamStr(0)+'" goto start');
  sl.Add('copy Новый_файл.exe "'+ParamStr(0)+'"');
  sl.Add('"'+ParamStr(0)+'"');
  sl.Add('del %0 >nul');
  s := sl.Text; AnsiToOEM(PChar(s), PChar(s)); sl.Text := s;
  sl.SaveToFile('$$tmp$$.bat');
  WinExec('$$tmp$$.bat',SW_HIDE);
  Application.Terminate;
end;

Автор: MacTep 8.2.2007, 13:18
С этим кодом заработала замена файла новым. Но две проблемы так и остались: не удаляется батник, не удаляется обновление. ... smile

Автор: Snowy 8.2.2007, 13:44
Ну так сам удали.
Программа же перезапускается.
Вот и приберись за собой smile
Можно также добавить
Код

 sl.Add('copy Новый_файл.exe "'+ParamStr(0)+'"');
 sl.Add('del Новый_файл.exe');

Автор: MacTep 8.2.2007, 13:53
Все, вопрос решен. Rodman & Snowy - всем по +1. smile Благодарю... smile

Автор: dumb 8.2.2007, 13:54
чтобы удалялся батник, перезапускать возможно нужно так:
Код

sl.Add('start "" "'+ParamStr(0)+'"');

Автор: MacTep 8.2.2007, 14:35
Что делать, если батник выдает кучу ошибок вида "Отказано в доступе" после каждой попытки удалить exe файл? Есть такая строка: D:\6\interstol>del D:\6\interstol\InterStol.exe  1>nul Что здесь обозначает 1>nul?

Автор: Snowy 8.2.2007, 14:43
>nul означает, что мы не хотим видеть сообщений.
Да и ничего страшного - окно-то скрыто smile

Автор: Bose 8.2.2007, 17:55
Цитата(MacTep @  8.2.2007,  14:35 Найти цитируемый пост)
Что делать, если батник выдает кучу ошибок вида "Отказано в доступе" после каждой попытки удалить exe файл?

Значит, или нет прав на запись, либо файл используется. 

сколько я не думал на тему обновлений, Идеальный вариант, судя по всему - делать http://en.wikipedia.org/wiki/Windows_Installer инсталляции. Правда, для того, чтобы с ним разобраться придётся прошерстить тонны документации.  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)