Самораспаковывающаяся программа Delphi - PullRequest
6 голосов
/ 26 апреля 2010

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

Что бы я хотел достичь:

  1. Пользователь запускает exe
  2. Exe распаковывает файлы, запускает программу обновления
  3. Если программа обновления обнаруживает и выдает ошибку, предлагает пользователю отправить логин по электронной почте
  4. После запуска средства обновления временные файлы удаляются (некоторые из этих файлов являются dll-файлами, используемыми программой средства обновления, поэтому средство обновления должно быть закрыто до удаления файлов)

Кто-нибудь может порекомендовать хорошее решение? Я думал об использовании Inno Setup (слишком сложной для такой простой задачи) или об использовании самораспаковывающегося zip-файла (но как впоследствии удалить файлы)?

Спасибо!

Ответы [ 3 ]

12 голосов
/ 27 апреля 2010

Лично я бы использовал Inno Setup, так как он очень хорошо подходит для этого типа задач. Удалять файлы очень легко, используя события сценариев, и выполнять удаление как часть шага после установки.

2 голосов
/ 27 апреля 2010

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

Я добавляю пример кода ниже.

файл exe.rc

newprog RCDATA Application.exe

файл makeres.bat

brcc32 exe.rc

файл updater.dpr

{$R exe.res}

файл модуля и процедуры

procedure ExtractRes(resname,fname,ext:string);
var
 rStream:TResourceStream;
 fStream:TFileStream;
 fNamex:string;
begin
 fNamex:=ExtractFilePath(Application.ExeName)+fname+'.'+ext;
 if not fileExists(fnamex) then
 begin
  try
   rStream:=tresourcestream.Create(hinstance,ResName,RT_rcDATA);
   fStream := TFileStream.Create(fnamex, fmCreate);
   fStream.CopyFrom(rStream, 0);
  finally
   rStream.Free;
   fstream.Free;
  end;
 end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
 apath:string;
begin
 if Timer1.Enabled then
  Timer1.Enabled:=false;
 apath:=ExtractFilePath(Application.ExeName);
 lblMesg.Caption:='Backup old version';
 Application.ProcessMessages;
 if FileExists(apath+'Application_old.bak') then
  DeleteFile(apath+'Application_old.bak') ;
 while FileExists(apath+'Application.exe') do
 begin
  RenameFile(apath + 'Application.exe', apath + 'Application_old.bak');
  sleep(1);
  if FileExists(apath+'Application.exe') then
  begin
   lblMesg.Caption:='It seems application still running. Waiting for end';
   if FileExists(apath+'Application_old.bak') then
    DeleteFile(apath+'Application_old.bak');
   DeleteFile(apath+'Application.exe');
  end;
  Application.ProcessMessages;
 end;
 lblMesg.Caption:='Creating New Version..';
 Application.ProcessMessages;
 ExtractRes('Application','Application','exe');
 lblMesg.Caption:='Running New Version...';
 Application.ProcessMessages;
 WinExec(pchar(apath+'Application.exe'),sw_show);
 Application.ProcessMessages;
 Halt;
end;

Я думаю, что это может помочь на ваш вопрос 1,2,3. Для 4 вы можете расширить код.

0 голосов
/ 27 апреля 2010

Возможно, не ответ Delphi, но если вы покупаете лицензию для WinRAR , вы можете использовать встроенную функцию простой настройки (вы сжимаете файл sfx, а скрипт сохраняется в файле комментариев)

Очень прост в использовании, может убирать за собой и хорошо сжимается!

...