RO28 – 在COM中使用RemObjects SDK

 

RO28 – COM 中使用 RemObjects SDK
本文向你展示 RO SDK3.0 COM 的支持 . 可以在 ASP, 脚本 ,Office Automation COM 环境调用 RO SDK SOAP 服务 .
安装 RO/COM
使用 RO Com 支持只需用在系统注册 ROCOM.dll. 如果你希望使用单纯的 COM 可以用如下方式注册 :
regsrv32 "c:/Program Files/RemObjects SDK for Delphi/Bin/ROCOM.dll"
我们推荐使用组件服务 MMC 注册成 COM+ .
如何安装 COM+ 对象
安装新的 COM+ 对象首先调出组件服务控制台 . 根据你的操作系统版本或者到控制面板中或者到开始菜单的管理工具中调用 .
  • 打开[我的电脑]节点,显示出[COM+应用程序]节点.
  • 下一步,或者右击[COM+应用程序]节点选择[New]菜单项新建应用,或在树中选择一个已经存在的应用.然后新建一个应用,使用默认值,设置一个可读性强的名字,"RemObjects SDK COM support".
  • 在树中打开你的应用程序节点,右击组件节点选择New|Component.
  • 选择Install new component(s)属性, RemObjects SDK (Common)/Bin 目录中选择ROCOM.DLL文件.
你将在下一页中看到对象 "ROCOMServer".
  • 点击下一步,完成.
RemObjects SDK COM 支持现在安装完毕可以使用了 .
访问服务
使用 RO/COM 第一步要创建你上面注册的 RemObjects.SDK.ComServer 对象的实例 . 根据你的脚本环境创建实例的方式会有所不同 . 例如 ,ASP 支持 Server.CreateObject 方法传入类型名称即可 :
<%
 var ROServer = Server.CreateObject( "RemObjects.SDK.COMServer" );
%>
你获取对象的引用后 ( 上面保存在 ROServer 变量中 ), 在任何环境下使用它都是很简单的 , 当然对不同支持 COM 的语言 (JavaScript, VBScript, Delphi ) 使用时语法有微小的不同 .
首先你需要选择使用通道和消息格式 . 设置 MessageType ChannelType 属性的值为 delphi 中的通道 / 消息类名 :
ROServer.MessageType = "BinMessage" ;
ROServer.ChannelType = "HTTP" ;
通道或消息可能需要设置 , 如设置服务地址 (TCP 通道的主机和端口名 ,HTTP 通道的 URL):
ROServer.SetChannelProperty( "TargetURL" , "http://localhost:8099/bin" );
设置好后就可以使用 CreateService 方法创建服务对象了 . 可将将这个返回的对象与在 Delphi 中使用 RO 时的代理等价起来 :
var MyService = ROServer.CreateService( "NewService" )
完成后就可以调用服务端定义的方法了 , :
var MyResult = MyService.Sum( 100 , 200 );
复杂类型
现在你已经可以调用简单的服务端方法了 , 但是对于复杂的类型如结构体 , 二进制数组怎么办 ?RO 支持创建这些类型包的特定方法 , 以便于向服务端传递它们 . 而且如果你的服务定义返回结构体或二进制数组你的服务调用也要返回类型包 .
这些特殊的函数如下 :
function CreateComplexType(const ComplexTypeName: WideString): OleVariant;
function CreateArrayType(const aArrayTypeName: WideString): OleVariant;
function CreateBinaryType: OleVariant;
除了 CreateBinary 方法外 , 其它的函数都需要一个服务端定义的类型名称 . 要获取 Person 结构体的代码如下 :
var Person = ROServer.CreateComplexType("TPerson");
Person.Name = "Klaus Meyer";
Person.Age = 35 ;
Person.Sex = "sxMale";
MyService.SomeMethodThatTakesAPerson(Person);
注意 : 一旦结构体的类型包返回后你可以象在 Delphi C# 中一样直接去操作其成员 . 运行时会做赋值的类型检查 , 并可能引发异常 :
Person.Age = "Klaus" ; // not a valid integer
Person.Sex = "Yes, Please" ; // not a valid value for this enum
二进制和数组操作很简单 , 除了在 RODL 中定义的方法 , 类型包提供了其它方法用于修改对象 :
IROCOMArray = interface
 procedure SetValue(aIndex: Integer; aValue: OleVariant);
 function GetValue(aIndex: Integer): OleVariant;
 property Count: Integer;
end ;
 
IROCOMBinary = interface
 procedure LoadFromFile(const aFilename: WideString);
 procedure SaveToFile(const aFilename: WideString);
 function ToString: WideString;
end ;
例如使用如下代码操作二进制或数组 :
var MyBinary = ROServer.CreateBinary;
MyBinary.LoadFromFile( "c:/test.txt" );
Response.Write(MyBinary.ToString); // output the content to ASP
 
var MyArray = ROServer.CreateArray( "IntArray" );
MyArray.Count = 3 ;
MyArray.SetValue( 0 , 200 );
MyArray.SetValue( 1 , 7436 );
MyArray.SetValue( 2 , 346 );
 
MyService.SomeOtherMethod(MyBinary, MyArray);
不支持的特性
COM 支持不提供有 var out 参数的方法调用 . 不幸的是 COM 架构中支持从脚本引擎调用方法的的 IDispatch 技术 , 除了方法返回值外不支持其他的返回值方式 . 所以当你设计可能会在 COM 中使用的服务接口时 , 只能使用返回值而不可以引入 Var Out 参数 .
当在 VBScript 中使用 RO/COM 方法是 , 当调用方法返回其他对象时一定要使用 Set 指令 .
否则 VBScript 将会试图调用返回值的默认索引 :
SET MyService = ROServer.CreateService( "MyService" ); // good
SET Person = MyService.GetCustomer( "Miller, Peter" ) // good
 
MyService = ROServer.CreateService( "MyService" ); // will fail
Person = MyService.GetCustomer( "Miller, Peter" ) // will fail
这是 RO/COM 无法控制的 VBScript 的局限性和矛盾 .
结论
本文已经给出在应用程序中使用 COM 支持的必要信息 . 现在可以很容易在脚本环境下调用 RomObjects SOAP 的服务 . 如果你在使用这个技术时发现非传统的令人兴奋的方法 , 请告知我们或将你的经验与其他开发者分享 .
* 使用含复杂类型的 SOAP 服务时 , 服务端必须支持 RODL 文件 .
 
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值