RO28 – 在COM中使用RemObjects SDK

来源:互联网 发布:华硕黄静 知乎 编辑:程序博客网 时间:2024/06/05 22:50

 

RO28 – COM中使用RemObjects SDK
本文向你展示RO SDK3.0COM的支持.可以在ASP,脚本,Office AutomationCOM环境调用RO SDKSOAP服务.
安装RO/COM
使用ROCom支持只需用在系统注册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 SDKCOM支持现在安装完毕可以使用了.
访问服务
使用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);
注意:一旦结构体的类型包返回后你可以象在DelphiC#中一样直接去操作其成员.运行时会做赋值的类型检查,并可能引发异常:
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支持不提供有varout参数的方法调用. 不幸的是COM架构中支持从脚本引擎调用方法的的IDispatch 技术,除了方法返回值外不支持其他的返回值方式. 所以当你设计可能会在COM中使用的服务接口时,只能使用返回值而不可以引入VarOut参数.
当在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支持的必要信息. 现在可以很容易在脚本环境下调用RomObjectsSOAP的服务.如果你在使用这个技术时发现非传统的令人兴奋的方法,请告知我们或将你的经验与其他开发者分享.
* 使用含复杂类型的SOAP服务时,服务端必须支持RODL文件.
 
原创粉丝点击