Самораспаковывающаяся программа Delphi

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

Что я хотел бы достигание:

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

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

Спасибо!

6
задан Zoë Peterson 26 April 2010 в 20:56
поделиться

3 ответа

Я использую ресурс для своей программы обновления. Я скомпилировал ресурс с помощью 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 можно расширить код.

2
ответ дан 8 December 2019 в 17:19
поделиться

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

12
ответ дан 8 December 2019 в 17:19
поделиться

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

Очень проста в использовании, может очищаться после себя и прекрасно сжимается!

0
ответ дан 8 December 2019 в 17:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: