kbmmw 中实现客户端自动更新
Posted xalion
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
正常更新。
以上是关于kbmmw 中实现客户端自动更新的主要内容,如果未能解决你的问题,请参考以下文章