java调用com组件方法

对照vb代码实现java调用com组件方法

2009-03-02 14:39

1.简介 
java调用com组件方法,最简单的方法莫过于使用JACOB控件。

JACOB就是 JAVA-COM Bridge的缩写,提供自动化的访问com的功能,也是通过JNI功能访问windows平台下的com组件或者win32系统库的。这是一个开始于1999年的开源项目的成果,有很多使用者对该项目进行了修改,做出了自己的贡献。最好的支持地点:http://groups.yahoo.com/group/jacob-project 
Jacob下载地址: 
http://sourceforge.net/project/showfiles.php?group_id=109543&package_id=118368

      Jacob的安装非常的简单,我们解开下载的jacob_1.9.zip,在文件夹中找到jacob.dll和jacob.jar两个文件。Jacob直接放到系统的system32文件夹下就行了,连注册都不用的(或者拷贝到jdk或者jre的bin目录下也行,当前测试文件所在的目录也行,就是只要在java.library.path中就可以)。而jacob.jar设置到classpath中去就可以了,或者在IDE开发环境的工程中设置扩展库也一样的。

2.对照VB的代码

举例:发送一个普通的消息到办公平台大蚂蚁 
    Dim Session, Msg,LoginInfo 
    Set Msg    = CreateObject("AntCom.AntMsg") 
    Set Session = CreateObject("AntCom.AntSyncSession") 
    Set LoginInfo   = CreateObject("AntCom.AntLoginInfo")

    Msg.Subject = "Start"      '消息的标题 
    Msg.Content = "hi, im admin"    '消息的内容 
    Msg.AddReceiver "user" , ""     '消息接收者,如果要发给多个人可以从次调'用 AddReceiver 
   Msg.ContentType = "Text/Text"    '消息内容的格式 
    LoginInfo.Server = "127.0.0.1"    'Bigant 的服务器地址 
   LoginInfo.ServerPort = 6080     'Bigant 的服务端口 
   LoginInfo.LoginName = "Admin"    '消息发送者的 LoginName 
    LoginInfo.PassWord = ""     '消息发送者的 Password 
    Session.Login LoginInfo      '登录 
    Session.SendMsg Msg, 0

3.分析 
   由上VB代码可以看出,分三步操作。首先利用CreateObject("AntCom.AntMsg")初始化ActiveX对象,然后设置各对象的属性值,例如Msg.Content = "hi, im admin",最后再调用对象的方法Session.SendMsg Msg, 0。很简单,设置属性值就是那种带=号的语句,不带=号就是方法操作。

4.对应java代码 
我们也分三步走。第一步,创建ActiveX对象,在创建之前引入 com.jacob.activeX.*; com.jacob.com.*;二个包。然后再创建对象ActiveXComponent smsg = new ActiveXComponent("AntCom.AntMsg");在java中,多有一步,必须Dispatch msg = smsg.getObject();处理才能真正得到该ActiveX对象,才能对它进行操作。

第二步,设置对象属性。对应3中的举例Msg.Content = "hi, im admin",对应的java语句就是Dispatch.put(msg,"Content","hi,i'm admin")。

第三步,调用对象方法。对应3中的举例Session.SendMsg Msg, 0,对应的java语句就是Dispatch.call(ses, "SendMsg",msg,0);

5.完整的代码。上面2中举例的所有vb代码,转成java就是:

package test; 

  1. import com.jacob.activeX.ActiveXComponent;  
  2. import com.jacob.com.Dispatch;  
  3. import com.jacob.com.Variant;  

public class Test { 
public static void main(String[] args){ 
   ActiveXComponent smsg = new ActiveXComponent("AntCom.AntMsg"); 
   ActiveXComponent sses = new ActiveXComponent("AntCom.AntSyncSession"); 
   ActiveXComponent sinfo = new ActiveXComponent("AntCom.AntLoginInfo"); 
   Dispatch msg = smsg.getObject(); 
   Dispatch.put(msg,"Subject","Start"); 
   Dispatch.put(msg,"Content","hi,i'm administrator"); 
   Dispatch.call(msg,"AddReceiver", "user",""); 
   Dispatch.put(msg,"ContentType","Text/Text"); 
   Dispatch info = sinfo.getObject(); 
   Dispatch.put(info,"Server","127.0.0.1"); 
   Dispatch.put(info,"ServerPort",6080); 
   Dispatch.put(info,"LoginName","Admin"); 
   Dispatch.put(info,"PassWord",""); 
   Dispatch ses = sses.getObject(); 
   Dispatch.call(ses, "Login",info); 
   Dispatch.call(ses, "SendMsg",msg,0);   


呵呵。到这里就全部OK了。


  jacob中调用的时候,如果要返回字符串,一定要这样写

   

[java] view plaincopy
  1. String str = "";  
  2. Variant v = new Variant(str, true);  
  3. comObj.call("HelloWorld", v);  

 

    new Variant()的第二个参数,指定是否强制按引用传递 (byref), 对于COM组件中是 out 类型的参数适合用这种


展开阅读全文

没有更多推荐了,返回首页