posts - 255,  comments - 537,  trackbacks - 0

我们过去做过了很多客户端,客户端随时需要更新,以保证与服务器端的功能一致,目前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

 

 正常更新。

 

posted on 2020-06-01 19:51  xalion  阅读(237)  评论(0编辑  收藏