RO28 – 在COM中使用RemObjects SDK
来源:互联网 发布:华硕黄静 知乎 编辑:程序博客网 时间:2024/06/05 22:50
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文件.
- RO28 – 在COM中使用RemObjects SDK
- RemObjects Sdk 使用简述
- RemObjects SDK
- 使用 RemObjects SDK 建立 WebService 应用
- 使用 RemObjects SDK 建立 WebService 应用
- RemObjects PascalScript中使用类
- RO38 –比较RemObjects SDK 通道
- RO38 –比较RemObjects SDK 通道
- RO13 – 智能项目:使用RemObjects SDK创建可升级的Smart Service
- [原创]使用RemObjects Hydra 开发 RemObjects SDK Service 过程中的异常问题解决
- 在RemObjects SDK的服务端捕获客户端请求
- RemObjects SDK 简介
- RO01 - RemObjects SDK 综述
- RemObjects SDK 简介[转载]
- 初试RemObjects SDK
- RemObjects SDK 9.0 Beta_CodeFirst
- RO15 – 深入RemObjects SDK消息流内幕-客户端
- RO45 – 如何写RemObjects SDK 服务 (.NET Version)
- 如何简单的解决Oracle XDB与Tomcat等的8080端口的冲突!
- RO27 - RemObjects 3.0 SDK 综述
- css 冲突
- SQL Server中的几个方法和Transact SQL 常用语句以及函数
- 无用的石头和有用的砖头
- RO28 – 在COM中使用RemObjects SDK
- 移动BOSS3.0开发管理平台项目日志:4月14日
- 上传文件如何检查重名?有重名时提示怎么写
- 经典java面试题
- 搜索引擎提交地址
- 2008-4-15 开通自己的博客
- RO29 – 使用服务测试器
- servlet和JSP过滤器Filter(全)
- zoj 1094