• [转载红鱼儿]kbmmw 开发点滴:kbmMW默认服务


    这两天,用xalion的入门文章学习kbmMW的使用,当用kbmMW向导生成一个Service后,需要注册到kbmMWServer中,具体的方法在生成的Service中已经有说明:

    // INSTRUCTIONS FOR REGISTRATION/USAGE
    // -----------------------------------
    // Please update the uses clause of the datamodule/form the TkbmMWServer is placed on by adding
    // YourServiceUnitName to it. Eg.
    //
    // uses ...,kbmMWServer,YourServiceUnitName;
    //
    // Somewhere in your application, make sure to register the serviceclass to the TkbmMWServer instance. Eg.
    //
    // var
    // sd:TkbmMWCustomServiceDefinition;
    // ..
    // sd:=kbmMWServer1.RegisterService(yourserviceclassname,false);
    //
    // Set the last parameter to true if this is the default service.
    //

    参考上面的说明代码,就是利用kbmMWServer的RegisterService注册即可,其中有两个参数

    第一个参数是Service的类名,这个参数很好理解,要注册的Service类是什么,拿来用即可,当然,别忘记use对应的Service单元。

    第二个参数为Boolean变量,意思是说将这个Service注册为默认的服务。我想,进一步理解,就是客户端在向服务请求具体功能函数时,不用加Service名,如下面这行代码的调用:

    edit2.Text:=kbmmwSimpleClient1.Request('TESTSERVICES','1.0','SUMNUM1',args);

    可以写成省略Serviceq名的,以简化调用,但做了如下的动改后,无法调用,提示说找不到服务。

    edit2.Text:=kbmmwSimpleClient1.Request('','','SUMNUM1',args);

    明明已经把要调用的服务注册成默认服务了,看来,不能这样用,或者这样理解。于是,进一步查看kbmMWSimpleClient还有哪些调用服务的方法,一路追到TkbmMWCustomClient这个类,还真不少方法,但大部分调用服务的方法第一个参数都是AServiceName.

    function SendPing:variant; overload; virtual;
    function SendPing(const AValue:variant):variant; overload; virtual;
    procedure AddStateID(AServiceName,AServiceVersion:string; AStateID:integer);
    function SendRequest(AServiceName,AServiceVersion:string; AFunc:string; const Args:array of Variant):Variant; virtual;
    function SendRequestEx(AServiceName,AServiceVersion:string; AStateID:integer; AFunc:string; const Args:array of Variant):Variant; virtual;
    function SendAsyncRequest(AServiceName,AServiceVersion:string; AFunc:string; const Args:array of Variant):longint; virtual;
    function SendAsyncRequestEx(AServiceName,AServiceVersion:string; AStateID:integer; AFunc:string; const Args:array of Variant):longint; virtual;
    procedure SendCall(AServiceName,AServiceVersion:string; AFunc:string; const Args:array of Variant); virtual;

    不明白了,上面这些TkbmMWCustomClient类的方法,只有SendPing没有AServiceName参数。(还不知SendPing是干什么的),如此的话,把一个服务注册成默认Service,有什么用呢?

    百思不得其解,于是向Xalion请教。他帮我修改了我做的学习代码,学习后才明白。原来,kwmMW作者在kbmmw中实现了一些服务(一些,目前只知道xalion帮我写的),可以拿来直接注册到kbmMWServer中,以供客户端调用。如:TkbmMWInventoryService,这个是从TkbmMWSimpleService继承来的Service,象注册自己做的Service一样。

    procedure TForm4.FormCreate(Sender: TObject);
    var
    sd:TkbmMWCustomServiceDefinition;
    begin
    sd:=kbmMWServer1.RegisterService(TkbmMWInventoryService,True);
    sd:=kbmMWServer1.RegisterService(TkbmMWSimpleService1,False);
    sd:=kbmMWServer1.RegisterService(TkbmMWQueryService2,False);
    end;

    在客户端这样调用:

    放一个对应的TkbmMWInventoryClient,并设置好Transport属性值,然后就可以象kbmMWSimpleClient一样向服务器发送请求了。

    如:

    kbmMWInventoryClient1.Refresh;

    memo1.Lines.Add(kbmMWInventoryClient1.Inventory.Text);

    调用后,在memo中会看到列出了Server注册的所有服务名。

    这就是kbmMW默认服务的目的?现在想是这样。

    另:可以将多个Service都注册为默认服务吗?经测试,在一个kbmMWServer中只能注册一个Service为默认服务。

    上面提到的kbmMWInventoryService,具估还有哪功能,看来还得花时间学习他的代码了,再续。

  • 相关阅读:
    写一个Windows上的守护进程(4)日志其余
    写一个Windows上的守护进程(3)句柄的管理
    写一个Windows上的守护进程(2)单例
    写一个Windows上的守护进程(1)开篇
    Xcode 特定项目运行提示无响应
    git squash 的使用
    关于.framework 文件过大 移除包内对i386 x86_64 的支持
    git 恢复被覆盖本地提交内容
    iOS企业应用 部署配置
    关于项目中测试环境跟正式环境的区分
  • 原文地址:https://www.cnblogs.com/xalion/p/2707677.html
Copyright © 2020-2023  润新知