kbmmw 中實現客戶端自動更新


我們過去做過了很多客戶端,客戶端隨時需要更新,以保證與服務器端的功能一致,目前Delphi中有很多實現客端端更新的控件,

好多同學也有自己實現客戶端自動更新的功能代碼,最新的kbmmw 中使用文件服務實現了客戶端自動更新,一事不煩二主,今天就

使用kbmmw 自身的功能實現客戶端自動更新。

首先我們需要做一個kbmmw 文件服務。這個很簡單

 

 生成一個kbmwm service 服務

unit Unit2;

// =========================================================================
// kbmMW - An advanced and extendable middleware framework.
// by Components4Developers (http://www.components4developers.com)
//
// Service generated by kbmMW service wizard.
//

interface

uses
  SysUtils,
  Classes,
  Forms,
  kbmMWSecurity,
  kbmMWServer,
  kbmMWServiceUtils,
  kbmMWFileService,
  kbmMWRTTI,
  kbmMWSmartServiceUtils;

type
  [kbmMW_Service('name:KBMMW_UPDATE, flags:[], rootPath:".\\updates", blockSize:1048576')]
  TkbmMWFileService1 = class(TkbmMWFileService)
  private
     { Private declarations }
  protected
     { Private declarations }
  public
     { Public declarations }
{$IFNDEF CPP}class{$ENDIF} function GetPrefServiceName:string; override;
{$IFNDEF CPP}class{$ENDIF} function GetVersion:string; override;
{$IFNDEF CPP}class{$ENDIF} function GetExtendable:boolean; override;
{$IFNDEF CPP}class{$ENDIF} function GetFlags:TkbmMWServiceFlags; override;
  end;

implementation

uses Unit1;

{$R *.DFM}


// Service definitions.
//---------------------

{$IFNDEF CPP}class{$ENDIF} function TkbmMWFileService1.GetPrefServiceName:string;
begin
     Result:='KBMMW_UPDATE';
end;

{$IFNDEF CPP}class{$ENDIF} function TkbmMWFileService1.GetVersion:string;
begin
     Result:='kbmMW_1.0';
end;

{$IFNDEF CPP}class{$ENDIF} function TkbmMWFileService1.GetExtendable:boolean;
begin
     Result:=false;
end;

{$IFNDEF CPP}class{$ENDIF} function TkbmMWFileService1.GetFlags:TkbmMWServiceFlags;
begin
     Result:=[mwsfListed];
end;

initialization
   TkbmMWRTTI.EnableRTTI(TkbmMWFileService1);

end.

注意服務的 名字,必須是 'KBMMW_UPDATE',你也可以修改,但是需要客戶端保持一致。

加上對應的kbmmwserver 和kbmMWTCPIPIndyServerTransport1 就可以了。

在創建窗體代碼的時候,別忘了使用自動注冊服務

procedure TForm1.FormCreate(Sender: TObject);
begin
     kbmMWServer1.AutoRegisterServices;
end;

 

服務器端好了,我們運行起來就ok.

新建一個工程作為客戶端。

放置對應的控件

 

 注意紅箭頭的屬性。

 

 設置客戶端的文件版本屬性。

注意這個版本的為2.0.0.5. 編譯后生成對應的exe 文件。

敲黑板,注意下面的操作。

在服務器端的 執行文件 目錄建立一個目錄 updates,然后再建立一個目錄DEMO,再建立一個目錄release_002_000_000_005,把上面生成的客戶端exe文件放入這個目錄。

 

 同時再建立一個manifest.json 文件。

內容為

{
  "description": "Project1 v2.0.0.5",
  "files": {
  "src": "release_002_000_000_005\\Project1.exe",
  "dst": "[!--app--!]\\Project1.exe",
  "restart": true
  }
}

 

我們重新打開客戶端,修改標簽並加入對應的代碼。

 

 

 

procedure TForm1.CheckForUpdate;
var
   bUpdate,bUpdateRequired:boolean;
begin
    // Check if updates are available
     bUpdate:=kbmMWUpdateClient1.IsUpdatesAvailable(true);
     if bUpdate then
        bUpdateRequired:=kbmMWUpdateClient1.IsRequiredUpdatesAvailable(false);

     if bUpdate then
     begin
          if bUpdateRequired then
             ShowMessage('A required update is available. It will auto update when you close this message.')
          else if MessageDlg('An optional, but recommended, update is available. Do you want to update?',
                             mtConfirmation,[mbYes, mbNo],0,mbYes)<>mrYes then
               exit;

         kbmMWUpdateClient1.Update;
     end;


end;

procedure TForm1.FormCreate(Sender: TObject);
begin

     ver.Caption :='當前版本:'+  kbmMWUpdateClient1.CurrentVersion;

end;

 

修改文件的版本信息。

 

 

 

 

 編譯並運行。

點擊檢查更新

 

 本更新為可選更新,可以選擇是否更新。

 選擇yes 后,就會自動更新本程序

 

那么我們也可以使用強制更新。

我們只需要把服務器端的目錄名加一個R,就表示強制更新。

 

{
  "description": "Project1 v2.0.0.5",
  "files": {
  "src": "release_002_000_000_005R\\Project1.exe",
  "dst": "[!--app--!]\\Project1.exe",
  "restart": true
  }
}

 

 運行客戶端程序

 

 

 點擊ok

 

 正常更新。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM