• 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

     正常更新。

  • 相关阅读:
    Unable to start adb server: adb server version (32) doesn't match this client (39); killing...
    mysql错误指令:Failed to open file "file_name" error 2/error 22
    爬虫流程概述
    Jupyter Notebook的使用
    markdown语法
    pymysql向表中插入数据
    python创建mysql数据库中的表
    python查询ip地址来源
    Pandas读取csv时设置列名
    程序员面试——位运算
  • 原文地址:https://www.cnblogs.com/xalion/p/13027137.html
Copyright © 2020-2023  润新知