快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

和记娱乐App_集报网



实际上,任何编写谋略机法度榜样的人都认识工具观点。用工具编程的一个主要的好处是一个分外有用的工具,如一个字符款式化法度榜样,能被一个利用法度榜样的很多不合部分使用。假如您把这种哲学用到逻辑结论,就没有来由问为什么不能把利用法度榜样本身看作是工具或被其它利用法度榜样作为工具来应用。这便是设计“组件工具模型”(Component Object Model)或者说 COM 来赞助创建的那种情况。

软件开拓者可以应用 COM 的框架来快速、简单地把自力的利用法度榜样改造成大年夜利用法度榜样的事情部分。但一些高档说话,象 Visual Basic 和 Java 说话,不能与 COM 简单建立接口。一个称为 自动节制器的层必需参与 COM 工具和用这些说话写的工具之间。鉴于越来越多的大年夜的利用法度榜样是用 Java 说话写的,必要一种便于集成的对象。Microsoft 所采纳的 Java 平台 ― Visual J++,有内置的自动节制器,然则标准 Java 用户没有这个好处。

Bridge2Java 经由过程在 Java 法度榜样中容许 COM 工具象其它 Java 工具一样应用来办理这个 Win和记娱乐Appdows 问题。在这篇文章里,我将给您一个 Bridge2Java 的高档概述;我同时也供给一个展示若何应用它的示例。

哀愁河上的金桥

一个支持 COM 的法度榜样(也称为 COM 办事器)容许其它法度榜样(也称为 COM 客户机)造访自己的措施和属性的历程称为 自动化。每一个支持自动化的 COM 办事器必须公开一个称为 IDispatch 的特殊接口。经由过程应用 IDispatch 接口和 Invoke() 措施,一个 COM 客户机可以调用 COM 办事器想公开的任何函数。Bridge2Java 经由过程用 Invoke() 措施来容许 Java 法度榜样和 COM 办事器通信;这个措施也把值返回给 Java 法度榜样。从 Java 法度榜样员的角度来说,Bridge2Java 容许 COM 工具就象其它 Java 工具一样被 Java 代码"看到"。可以从工具调用函数;数据类型全是 Java 的数据类型;以致连 COM 事故也被捕获并发送到 Java 法度榜样。

什么是 JNI?

Java 说话的设计者熟识到创建 100% 的纯 Java 利用法度榜样是个宏伟的目标。他们也知道事实上,这个目标平日很难达到。跟着开拓新的 Java 利用法度榜样,开拓者常常不甘愿宁肯丢弃曩昔写的可能很昂贵或者很难的原码。 Java 的本机接口或者说 JNI,供给了一个由 Java 虚拟机(JVM)出来并进入 JVM 在运行的本权术略机天下的通道(doorway)。经由过程应用这个通道,Java 法度榜样员可以应用先前昂贵的或者弗成能的原码来重写成 Java 代码。JNI 容许本机代码调用 JVM,创建并造访工具,调用工具措施并造访实例变量。这种折中为开拓者丢弃了 Java 平台的“写一次,在任何地方运行”这个好处,由于调用的任何本机代码将会被绑缚到特殊的平台。

JNI:基滥觞基本理

Java 天下和 COM 天下的界限被用“Java 本机接口”(Java Native Interface(JNI))桥接起来了。只有两个 JNI 调用是必需的:一个是创建 COM 办事器,另一个是处置惩罚 Invoke() 措施。只要发生了一次 Java 函数调用就调用 Invoke() ;它事实上是全部“Java 到 COM”历程的要核。然而,假如连接 Java 和 COM 工具和经由过程 Invoke() 传送一个从 Java 代码到 COM 的调用一样简单,那么 Bridge2Java 将会是一个异常简单的法度榜样。Bridge2Java 的实际事情是在把 Java 变量改变成 COM 能理解的变量类型来完成的。变量称为 VARIANT 并且是包孕所有可能类型和指出存储的数据实际类型值的布局。大年夜多半 Java 变量奇妙映射到 VARIANT ― 例如,一个 int 很轻易地映射到 VARIANT 中的 VT_I4 类型。实际的艰苦是在于将象 SAFEARRAY 和 BYREF 值这样的 COM 类型映射到 Java 的等价类型。

转换变量的历程由一个 Java 代理调用开始,该调用创建并批量装入一个自定义建立的 Java 版的 VARIANT ,称为 Jvariant 。这个 Jvariant 能包孕所有的 Java 变量类型,再加上一个域,该域指出包孕的数据应该被转换成 COM 真个哪种类型。Bridge2Java 中的 SAFEARRAYS 被以 Jvariant 数组形式从 Java 代码传入。Bridge2Java 然后在 COM 端构建适当类型的数组并用输入数组的值批量装入它。假云云数组(或任何其它值)是 BYTEREF ,那么 Bridge2Java 必须能用更新的值替代传入的值。它经由过程应用数个来自 COM 真个容许更新 Java 数组元素的 JNI 调用之一做到这一点。

图 1 展示 Bridge2Java 若何把 Java 敕令传送到 COM 办事器的纵览。

图 1. Bridge2Java 纵览

一个样本利用法度榜样:建桥

应用 Bridge2Java 的第一步是把 COM 办事器的接口、措施和属性转换成 Java 代理工具和措施。这是由代理天生器(包括 Bridge2Java)完成的,并且要求用户为 COM 办事器定位 typelib。( typelib 仅仅是 COM 办事器法度榜样员供给的便利;它为 COM 办事器供给了所有接口、措施和属性的有序清单。)Bridge2Java 代理天生器遍历 typelib,并为它所发明的每一个 IDispatch 接口天生 Java 工具。这样创建的每一个 Java 工具包孕来自自 IDispatch 接口的所有措施和属性。属性将被天生为 get_ 和 set_ 措施,例如 get_Visible() 和 set_Visible(BOOL visible) 。

我们的样本利用法度榜样将展示 Java 开拓者若何能应用 Bridge2Java 和 COM 调用 Lotus 1-2-3 功能。清单 1 展示了来自代理天生器的片段。这个示例类是用于我们利用法度榜样指向 Lotus 1-2-3 的 IDispatch 接口。(1-2-3 的 typelib 称为 L123TYP.TLB )。

这个示例中有几个紧张的工作值得留意。一个是列在文件上部的 cslid ;这是 IDispatch 接口的独一标识并是 COM 造访注册表找到 Lotus 1-2-3 位置时应用的值。当 Bridge2Java 启动 1-2-3 时,COM 传回一个指向 IDispatch 接口的指针,它将被随后的 Invoke() 调用所使用来和 COM 办事器通信。

“Java 到 COM”历程的另一个紧张部分是创建并初始化包孕传入值和类型的 Jvariant 类。 invoke_method() 调用平日创建几个 Jvariant ,用于每一个传入的参数。在只返回一个值的环境下, Jvariant 就被隐式地创建并且只传回返回值。

Bridge2Java 也应用所有存在于 invoke_method() 调用的十六进制值。这些值称为 dispids 并且它们独一标识 _Application 接口中的每一个措施。 Invoke() 应用这些值,连同上面提到的 IDispatch 接口指针和任何必需的 VARIANT ,来唯必然位和调用由这个接口供给的所有措施。

列表 1. Application.java

// Dispatch Proxies

package Lot123;

import com.ibm.bridge2java.*;

import java.util.Date;

public class Application extends Dispatch implements COMconstants

{

public static final String clsid = "{29130071-2EED-1069-BF5D-00DD011186B7}";

public Application()

{

super(clsid);

}

public Application(String clsidin)

{

super(clsidin和记娱乐App);

}

public Application(int IDispatch)

{

super(IDispatch);

}

public Application(Object theObject)

{

super(theObject);

}

public Application(int canvasHWND, int nullval)

{

super(clsid, canvasHWND);

}

public Application(String clsidin, int canvasHWND, int nullval)

{

super(clsidin, canvasHWND);

}

public String ExtendedName(Object nametype)

{

Jvariant args[] = {new Jvariant(nametype,VT_VARIANT)};

return invoke_method(args, 0x1000300, DISPATCH_METHOD).StringVal();

}

public void Goto()

{

invoke_method_void(null, 0x1000304, DISPATCH_METHOD);

}

.

.

.

public Object get_Run()

{

return invoke_method(null, 0x100ea00, DISPATCH_PROPERTYGET).ObjectVal();

}

public void set_Run(Object value)

{

Jvariant args[] = {new Jvariant(value, VT_VARIANT)};

invoke_method_void(args, 0x100ea00, DISPATCH_PROPERTYPUT);

}

public String get_ProductVersion()

{

return invoke_method(null, 0x14c0211, DISPATCH_PROPERTYGET).StringVal();

}

public void set_ProductVersion(String value)

{

Jvariant args[] = {new Jvariant(value, VT_BSTR)};

invoke_method_void(args, 0x14c0211, DISPATCH_PROPERTYPUT);

}

}

天生代理之后,现在用户可以写 Java 利用法度榜样来和 COM 办事器会话了。清单 2 展示了一个小的法度榜样,它将启动 1-2-3,把一行写到一个单元格,复制那一行,等待一秒钟,然后不保存地关闭 1-2-3。这是个简单的示例,然则它阐清楚明了构建一个更繁杂的法度榜样所必需的每一件事。很多示例包括在 Bridge2Java 包中,和其它的一路,该包展示了若何捕获事故并在 Java 画布中描画 COM 办事器。

列表 2. Quick123.java

// Description: This is a B和记娱乐Appridge2Java Lotus 1-2-3 demo. This demo brings up

//       1-2-3, writes "This is a test" in the first cell,

//       copies the first cell to the cell below it, waits 1 second,

//       then quits.

//

// Setup: None

//

// Author: Bill Phillips

//

import Lot123.*;

public class Quick123

{

public static void main(java.lang.String[] args) {

Application app;

Ranges ranges;

Document doc;

Range rangeA1, rangeA2;

try

{

// Set up the com environment.

com.ibm.bridge2java.OleEnvironment.和记娱乐AppInitialize();

// Create a new document (which starts 123).

doc = new Document();

// Get the application object.

app = new Application(doc.get_Parent());

// Make the application visible.

app.set_Visible(new Boolean("true"));

// Open the Range workbook.

doc = new Document(app.NewDocument());

// Get all of the ranges.

ranges = new Ranges(doc.get_Ranges());

// Get cell A1.

rangeA1 = new Range(ranges.Item(new String("A1")) );

// Set the contents of cell A1

rangeA1.set_Contents("This is a test");

// Get cell A2.

rangeA2 = new Range(ranges.Item(new String("A2")) );

// Copy the contents of cell A1 into cell A2

rangeA1.QuickCopy(rangeA2);

// Wait one second

Thread.sleep(1000);

// Quit 123 without saving

app.Quit("false");

} catch (com.ibm.bridge2java.ComException e)

{

System.out.println( "CO和记娱乐AppM Exception:" );

System.out.println( Long.toHexString((e.getHResult())) );

System.out.println( e.getMessage() );

} catch (Exception e)

{

System.out.println("message: " + e.getMessage());

} finally

{

app = null;

com.ibm.bridge2java.OleEnvironment.UnInitialize();

}

}

}

总结

COM 供给了一种体系布局,该体系布局容许在真实组件级别应用法度榜样而不用关心它们的版本、写法度榜样所用的说话以致它们运行的位置。Java 平台供给了一个易于临时用户进修和应用的说话。Bridge2Java 超过了繁杂仍强大年夜的 COM 天下和 Java 说话的简单性之间的鸿沟。

Bridge2Java 当前是 IBM alphaWorks 技巧,这意味着可以下载并评估它,与开拓小组分享您的设法主见。您也可以获取许可把它用到您自己的产品中。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: