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
文件
.