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


Автор: CHERRY 5.5.2007, 20:58
Есть прога которую пользуют N юзеров в сети. Прога в стадии разработки. Нужно оперативно доставлять update пользователям.
Первое, что приходит на ум, написать загрузчик, который будет проверять есть ли обновление, заменять и затем загружать exe-файл.
Но хотелось бы видеть более изящное решение.
Как Вы думаете?

Автор: MetalFan 5.5.2007, 21:02
CHERRY, а по-другому как еще? по любому еще одно приложение должно быть, чтобы главное обновлять)

Автор: CHERRY 5.5.2007, 21:10
Возможно прога проверяет обновление и если оно есть, то сохраняет его у себя в папке с другим расширением,
а когда идет завершение проги она себя убивает в памяти и переименовывает обновление для следующего запуска.
Потому и задаю вопрос.
Мы часто видим, когда работающая прога предлагает загрузить обновления (например Corel Draw, Adobe-семейства и т.д.)

Автор: Snowy 5.5.2007, 21:37
У этих прог есть отдельная программа самообновления.
А для одной программы способов много.
Например написать bat-файл, который перезапишет программу при выходе.
Примеров полно.
Поищи поиском по слову "автообновление"

Автор: Poopkeen 30.10.2007, 15:17
вот как реализовано у меня - если еще интересно

в dpr главного проекта
Код


uses appfunc
 
begin
  if not NewExeExists(Application.Handle, Application.Exename, 'options.ini') then
  begin
        Application.Initialize;
        Application.Title := 'Program';
        Application.CreateForm(TPFmainForm, PFmainForm);
        Application.CreateForm(TDM01Form, DM01Form);
        Application.Run;
  end;
      end;
end.


модуль appfunc.pas
берет из инишки строку типа filefrom=\\server\folder\application.exe
extractres - функция из faq'ов по извлечению бинарного файла из программы

Код

function NewExeExists(const AHandle: THandle; const aexename,
  inifilename : string) : boolean;
var
  ri : TIniFile;
  fromstr, tostr, efp1, ff, tf : string;
begin
  result:=False;
  efp1:=ExtractFilePath(aexename);
  ri:=TIniFile.Create(ExtractFilePath(aexename)+inifilename);
  try
    fromstr:=ri.ReadString('RENEW','FILEFROM','');
    tostr:=efp1;
    ff:=fromstr;
    tf:=aexename;
  finally
    ri.Free;
  end;
  IF fromstr<>'' then
  begin
    if FileAge(tf)<FileAge(ff) then
    begin
      result:=True;
      //*********************************************
      if ExtractRes('EXEFILE', 'NEWEXE', 'newexe.exe') then
        if FileExists(efp1+'newexe.exe') then
      begin
        ShellExecute(AHandle, 'open', PChar(efp1+'newexe.exe'),
          PChar('"'+ff+'"'+' '+'"'+tf+'"'), PChar(efp1), SW_NORMAL);
      end;
    end;
  end
end;



модуль newexe.dpr
Код


program newexe;

{$APPTYPE CONSOLE}

uses
  SysUtils, Windows, ShellApi;

var
  s1, NewStr: string;

begin
  // ParamStr(1) - откуда копировать
  // ParamStr(2) - куда копировать
  if ParamCount>0 then
  begin
    s1:='Установка нового EXE-файла';
    SetLength(NewStr, Length(s1));
    CharToOem(PChar(s1), PChar(NewStr));
    Writeln(NewStr);
    s1:='Подождите, пожалуйста...';
    SetLength(NewStr, Length(s1));
    CharToOem(PChar(s1), PChar(NewStr));
    Writeln(NewStr);
    Sleep(5000);
    CopyFile(PChar(ParamStr(1)), PChar(ParamStr(2)), False);
    WinExec(PChar(ParamStr(2)), SW_NORMAL);
  end;
end.




вроде все smile

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