6

Delphi7でアップデータプログラムを作成しています。このプログラムは1回実行されますが、実行するには多くのファイルが必要です。

私が達成したいこと:

  1. ユーザーがexeファイルを実行します
  2. エグゼはファイルを解凍し、アップデータを実行します
  3. アップデータが検出してエラーが発生した場合、ログイン電子メールを送信するようにユーザーに促します
  4. アップデータの実行後、一時ファイルが削除されます(これらのファイルの一部は、アップデータプログラムによって使用されるdllであるため、ファイルを削除する前にアップデータを閉じる必要があります)

誰かが良い解決策をお勧めできますか?Inno Setup(このような簡単なタスクには複雑すぎる)または自己解凍型zipファイル(後でファイルを削除する方法)を使用することを考えましたか?

ありがとう!

4

3 に答える 3

12

個人的には、このタイプのタスクに非常に適しているInnoSetupを使用します。スクリプトイベントを使用してファイルを削除するのは非常に簡単で、インストーラー後の手順の一部として削除を実行します。

于 2010-04-26T20:13:29.270 に答える
2

更新プログラムにリソースを使用しています。私はアップデータプログラムをコンパイルするよりもbrc​​c32でリソースをコンパイルしていました。アップデータプログラムが自己チェックを実行するときは、すべてをチェックし、新しいもので書き込みまたは更新します。ただし、このプロセスについては、プログラムを実行する場所での書き込み、削除の権限を正しく設定する必要があります。

以下にサンプルコードを追加しています。

ファイル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の場合、コードを拡張できます。

于 2010-04-27T00:03:24.183 に答える
0

Delphiの答えではないかもしれませんが、WinRARのライセンスを購入すると、組み込みの簡単なセットアップ機能を使用できます(sfxファイルに圧縮すると、スクリプトはコメントファイルに保存されます)

非常に使いやすく、それ自体の後片付けができ、うまく圧縮できます!

于 2010-04-27T08:58:57.943 に答える