Difference between revisions of "Zh/Documentation/DevGuide/ProUNO/Bridge/DCOM"

From Apache OpenOffice Wiki
Jump to: navigation, search
m (New page: {{Documentation/DevGuide/ProUNOTOC/Zh |ProUNO2c=block |ABridgeSvcMgr=block |ShowPrevNext=block |PrevPage=Zh/Documentation/DevGuide/ProUNO/Bridge/Automation Objects with UNO Interfaces |Nex...)
 
 
Line 6: Line 6:
 
|NextPage=Zh/Documentation/DevGuide/ProUNO/Bridge/The Bridge Services
 
|NextPage=Zh/Documentation/DevGuide/ProUNO/Bridge/The Bridge Services
 
}}
 
}}
[[en:Documentation/DevGuide/ProUNO/Bridge/DCOM]]
+
{{Documentation/DevGuideLanguages|Documentation/DevGuide/ProUNO/Bridge/{{SUBPAGENAME}}}}
 
{{DISPLAYTITLE:DCOM}}
 
{{DISPLAYTITLE:DCOM}}
  

Latest revision as of 03:10, 14 May 2009



Automation 桥将所有 UNO 对象映射成 Automation 对象。也就是说,所有这些对象都实现 IDispatch 接口。要访问远程接口,客户机和服务器必须能够封送该接口。Windows 已经提供对 IDispatch 的封送处理,因此,可以远程使用源自桥的所有对象。


要使 DCOM 工作,需要对客户机和服务器应用适当的安全设置。这可以通过设置适当的注册表项或以编程的方式调用程序中安全 API 函数来完成。办公软件不处理安全性,因此,只能通过不完全由办公软件安装程序设置的注册表设置进行确定。没有设定 AppID 项,它记录安全设置。不会产生任何问题,因为 dcomcnfg.exe 配置工具可以自动设置此项。


要远程访问服务管理器,客户机必须具有启动和访问权限。这些权限是 AppID 的子键,而且具有二进制值。可以使用 dcomcnfg 编辑这些值。同时,必须将服务管理器的身份设置为“交互式用户”。当通过远程激活服务管理器来启动办公软件时,办公软件以当前登录的用户(交互式用户)的帐号运行。


如果回调(办公软件调用客户机),客户机必须调整其安全设置,从而接受发来的办公软件调用请求。将作为 Automation 对象(而不是 UNO 组件)实现的侦听器对象以参数形式传送到 UNO 对象时,就会发生这种情况,而这又会调用这些对象。也可能由 Automation 桥产生回调,例如,使用 JScript Array 对象时。然后,桥通过其 IDispatchEx 接口修改 Array 对象。要获取接口,桥必须通过回调客户机来调用 QueryInterface


要避免这些回调,可以使用 VBArray 对象和 Value Objects


要设置客户机安全属性,请在客户机程序内使用安全 API,或者再次使用 dcomcnfg。API 的使用可能比较困难。修改注册表是最容易的方法,使用 dcomcnfg 简化了设定过程。这还会增强灵活性,因为管理员可以轻松地更改设定,而无需编辑源代码和重建客户机。但是,dcomcnfg 仅适用于 COM 服务器,而不适用于普通可执行程序。要使用 dcomcnfg,请将客户机代码放在一个可以在客户机计算机上注册的服务器中。这不仅适用于 exe 服务器,而且适用于进程内服务器,即 dll。当这些服务器处于远程状态时,具有一个 AppID 项,即它们具有 DllSurrogate 子项设定。要激活它们,需要一个实例化进程内服务器的附加可执行程序。初次调用服务器的一个接口时,DCOM 使用注册表中的值来初始化安全性,但是,只有在可执行程序没有事先调用 CoInitializeSecurity 的情况下,这才会起作用。


要运行 JScript 或 VBScript 程序,需要一个运行脚本的附加程序,即脚本控制器,例如,Windows Scripting Host (WSH)。这些控制器的问题是,自己调用 CoInitializeSecurity 可能会影响自身的安全设置。遇到这种情况,不会使用先前在注册表中为控制器设定的安全设置。另外,不必通过 dcomcnfg 配置控制器,因为它可能不是 COM 服务器。WSH(非远程 WSH)也是如此。


要去掉这些限制,需要在创建脚本引擎之前,编写一个应用安全设置的脚本控制器。这一过程非常耗时,而且需要具备一些引擎知识以及良好的编程技能。Windows Script Components (WSC) 使用比较简便。WSC 由一个包含 XML 的文件构成,而且可以将现有的 JScript 和 VBS 脚本放到各自的 XML 元素中。并提供了一个生成它的向导。必须注册 WSC,这可以通过 regsvr32.exe 或直接通过文件资源管理器中的上下文菜单来完成。要拥有一个 AppID 条目,请将组件声明为可以远程访问。这可以通过将 remotable 属性插入到 wsc 文件的注册元素中来完成:

 <registration
     description="writerdemo script component"
     progid="dcomtest.writerdemo.WSC”
     version="1.00"
     classid="{90c5ca1a-5e38-4c6d-9634-b0c740c569ad}"
     remotable="true">


注册 WSC 后,注册表中具有一个对应的 AppID 项。使用 dcomcnfg 对该组件应用所需的安全设置。要执行脚本,需要一个可执行程序。例如:

 Option Explicit
 Sub main()
     Dim obj As Object
     Set obj = CreateObject("dcomtest.writerdemo.wsc”)
     obj.run
 End Sub


在该示例中,脚本代码包含在运行函数中。下面是 wsc 文件的内容:

 <?xml version="1.0"?>
 <component>
 <?component error="true" debug="true"?>
 <registration
     description="writerdemo script component"
     progid="dcomtest.writerdemo.WSC”
     version="1.00"
     classid="{90c5ca1a-5e38-4c6d-9634-b0c740c569ad}"
     remotable="true">
 </registration>
 <public>
     <method name="run">
     </method>
 </public>
 <script language="JScript">
 <![CDATA[
 var description = new jscripttest;
 function jscripttest()
 {
     this.run = run;
 }
 function run()
 {
 var objServiceManager= new ActiveXObject("com.sun.star.ServiceManager”,"\\jl-1036");
 var objCoreReflection= objServiceManager.createInstance("com.sun.star.reflection.CoreReflection");
 var objDesktop= objServiceManager.createInstance("com.sun.star.frame.Desktop");
 var objCoreReflection= objServiceManager.createInstance("com.sun.star.reflection.CoreReflection");
 var args= new Array();
 var objDocument= objDesktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, args);
 var objText= objDocument.getText();
 var objCursor= objText.createTextCursor();
 objText.insertString( objCursor, "The first line in the newly created text document.\n", false);
 objText.insertString( objCursor, "Now we're in the second line", false);
 var objTable= objDocument.createInstance( "com.sun.star.text.TextTable");objTable.initialize( 4, 4);
 objText.insertTextContent( objCursor, objTable, false);
 var objRows= objTable.getRows();
 var objRow= objRows.getByIndex( 0);
 objTable.setPropertyValue( "BackTransparent", false);
 objTable.setPropertyValue( "BackColor", 13421823);
 objRow.setPropertyValue( "BackTransparent", false);
 objRow.setPropertyValue( "BackColor", 6710932);
 insertIntoCell( "A1","FirstColumn", objTable);
 insertIntoCell( "B1","SecondColumn", objTable);
 insertIntoCell( "C1","ThirdColumn", objTable);
 insertIntoCell( "D1","SUM", objTable);
 objTable.getCellByName("A2").setValue( 22.5);
 objTable.getCellByName("B2").setValue( 5615.3);
 objTable.getCellByName("C2").setValue( -2315.7);
 objTable.getCellByName("D2").setFormula("sum <A2:C2>");objTable.getCellByName("A3").setValue( 21.5);
 objTable.getCellByName("B3").setValue( 615.3);
 objTable.getCellByName("C3").setValue( -315.7);
 objTable.getCellByName("D3").setFormula( "sum <A3:C3>");objTable.getCellByName("A4").setValue( 121.5);
 objTable.getCellByName("B4").setValue( -615.3);
 objTable.getCellByName("C4").setValue( 415.7);
 objTable.getCellByName("D4").setFormula( "sum <A4:C4>");
 objCursor.setPropertyValue( "CharColor", 255);
 objCursor.setPropertyValue( "CharShadowed", true);
 objText.insertControlCharacter( objCursor, 0 , false);
 objText.insertString( objCursor, " This is a colored Text - blue with shadow\n",false);
 objText.insertControlCharacter( objCursor, 0, false );
 var objTextFrame= objDocument.createInstance("com.sun.star.text.TextFrame”);
 var objSize= createStruct("com.sun.star.awt.Size");
 objSize.Width= 15000;
 objSize.Height= 400;
 objTextFrame.setSize( objSize);
 objTextFrame.setPropertyValue( "AnchorType", 1);
 objText.insertTextContent( objCursor, objTextFrame, false);
 var objFrameText= objTextFrame.getText();
 var objFrameTextCursor= objFrameText.createTextCursor();
 objFrameText.insertString( objFrameTextCursor, "The first line in the newly created text frame.",false);
 objFrameText.insertString(objFrameTextCursor, "With this second line the height of the frame raises.", false );
 objFrameText.insertControlCharacter( objCursor, 0 , false);
 objCursor.setPropertyValue( "CharColor", 65536);
 objCursor.setPropertyValue( "CharShadowed", false);
 objText.insertString( objCursor, " That's all for now !!", false );
 
 function insertIntoCell( strCellName, strText, objTable)
 {
     var objCellText= objTable.getCellByName( strCellName);
     var objCellCursor= objCellText.createTextCursor();
     objCellCursor.setPropertyValue( "CharColor",16777215);
     objCellText.insertString( objCellCursor, strText, false);
 }
 function createStruct( strTypeName)
 {
     var classSize= objCoreReflection.forName( strTypeName);
     var aStruct= new Array();
     classSize.createObject( aStruct);
     return aStruct[0];
 }
 }
 ]]>
 </script>
 </component>

该 WSC 包含用 JScript 编写的 WriterDemo 示例。

Content on this page is licensed under the Public Documentation License (PDL).
Personal tools
In other languages