したがって、アルゴリズム:
- オンにすると、プログラムはサーバー上の最新バージョンをチェックします。
- サーバーが現在よりも高い場合は、プログラムでZipアーカイブをダウンロードします。
- たとえば、program.exeからprogram.backupに、アプリケーションファイルの名前を別の名前に変更します(バックアップおよびファイルアクセスのため)。
- フォルダー内のファイルを置き換えるアーカイブを解凍します。
- 更新されたアーカイブを削除します。
- プログラムを再起動します。
しかし、このすべての前に、最初にフィールドを持つMSSQLでアップデータテーブル(たとえば)を作成します。
name-タイプvarchar;
version- varchar型。
ファイル -varbinary(max)(またはその他のblobフィールド)と入力します。
名前フィールドにプログラムがあるテーブルにすぐにレコードを作成することをお勧めします。
次の手順をコードに追加して、プログラムのバージョン番号を抽出します。
function TForm1.GetMyVersion: string; type TVerInfo=packed record Nevazhno: array[0..47] of byte; // 48 Minor,Major,Build,Release: word; // end; var s:TResourceStream; v:TVerInfo; begin result:=''; try s:=TResourceStream.Create(HInstance,'#1',RT_VERSION); // if s.Size>0 then begin s.Read(v,SizeOf(v)); // result:=IntToStr(v.Major)+IntToStr(v.Minor)+ // ... IntToStr(v.Release)+IntToStr(v.Build); end; s.Free; except; end; end;
アップデートをzipアーカイブに保存し、 SevenZipライブラリを使用して、Delphiのライブラリソースへのパスをライブラリに追加するため、アーカイブを解凍するためのライブラリが必要になりました。
ここで、新しいバージョンのプログラムとともにアーカイブ自体をデータベースにアップロードする必要があります。 サーバーに更新をアップロードするフォームを作成しました:
OpenDialogを開くには、すべてが明確だと思います編集中のパスを書き換えます
if OpenDialog1.Execute then cxButtonEdit1.Text:=OpenDialog1.FileName;
バージョン番号は、マスク付きでMaskEditに入力する方が適切です - !9.9.9.0; 1; _
保存ボタンで、次の手順でファイルをアップロードします。
var blobF: TBlobField; begin if not FileExists(OpenDialog1.FileName) then begin ShowMessage(' !'); exit; end else cxButtonEdit1.Text:=OpenDialog1.FileName; try ADOTable1.TableName:=Updater; // ADOTable1.Close; ADOTable1.Open; // name program ADOTable1.Filtered := False; ADOTable1.Filter := 'name='+#39+'program'+#39; ADOTable1.Filtered := True; ADOTable1.Edit; blobF := ADOTable1.FieldByName('files') as TBlobField; blobF.LoadFromFile(OpenDialog1.FileName); ADOTable1.FieldByName('version').AsString:=cxMaskEdit1.Text; ADOTable1.Post; except Showmessage(' !'); end;
これは少し間違った方法です。特にアーカイブが大きい場合は、別のストリームを作成するのが最善です。
Uses- SevenZipおよびShellAPIに追加する必要があります 。
ここで、最も重要な更新手順を作成し、Updateと呼びます。
Procedure TForm1.Update; var path,fullpath,Ourversion,LastVersion:string; blobF: TBlobField; begin // adoquery4.Active:=false; adoquery4.sql.text:='SELECT version FROM [dbo].[Updater] WHERE name='+#39+'program'+#39; adoquery4.Active:=true; // , Ourversion:=GetMyVersion; LastVersion:=adoquery4.FieldByName('version').Value; while pos('.',LastVersion)<>0 do delete(LastVersion,pos('.',LastVersion),1); // if strtoint(LastVersion)>strtoint(Ourversion) then If messageBox(Handle,' . ?','?', mb_YesNo or mb_iconquestion)=mrYes then try path:=ExtractFileDir(ParamStr(0)); if FileExists(path+'\Program.backup') then DeleteFile(path+'\Project2.backup'); RenameFile(path+'\Program.exe', path+'\Program.backup'); // // //ADOTable1 Updater ADOTable1.Close; ADOTable1.Open; ADOTable1.Filtered := False; ADOTable1.Filter := 'name='+#39+'program'+#39; ADOTable1.Filtered := True; ADOTable1.Active:=true; // blobF := ADOTable1.FieldByName('files') as TBlobField; if blobF.Value = nil then Exit; blobF.SaveToFile(path+'\Update_ARMTitan.zip'); ADOTable1.Active:=false; // with CreateInArchive(CLSID_CFormatZip) do begin OpenFile(ExtractFilePath(ParamStr(0)) + 'Update_ARMTitan.zip'); ExtractTo(ExtractFilePath(ParamStr(0))); Close; end; // DeleteFile(path+'\Update_ARMTitan.zip'); // fullpath:=path+'\Project2.exe'; ShellExecute(0, 'open', PWideChar(fullpath), '', nil, SW_SHOW); //WinExec(PAnsiChar(fullpath), SW_SHOW); Application.Terminate; // or: Close; finally end; end;
ここにも欠点があります。各ファイルを個別に解凍し、エラーをチェックする方がよいでしょう。アーカイブ全体ではなく、
留意すべき2つの小さなことがあります。
1.プログラムのあるディレクトリに7z.dllファイルがあるはずなので、以下を確認することをお勧めします。
if FileExists(path+'\7z.dll') then begin ShowMessage(' 7z.dll'); exit; end;
または何か他のもの。
2.更新されたアーカイブには、使用されている7z.dllファイルを含めないでください。または、上記で書いたようにすべてを個別に解凍し、このファイルのみを解凍しないでください。
以上です。 主なことは、プログラムのバージョン番号を変更してアーカイブに追加する前に、更新のために完成したプログラムをコンパイルする前に忘れないことです。
この方法にはいくつかの欠陥があり、私はそれを知っています。 しかし、今のところ、私はそれを使用しており、問題を経験していませんが、最終決定する価値はあります。