读书人

java中jacob调用ocx失误!

发布时间: 2012-10-11 10:16:10 作者: rapoo

java中jacob调用ocx出错!!!
最近公司在做一个项目中有需要调用远程视频监控的部分。
远程的视频服务器是由第三方公司开发的,他们提供了ocx控件用于做开发调用。

在Javascript已经实现调用,远程视频可以调用出来。
但是在js中调用,每台客户机就都得下载安装ocx控件(当然这样也可以)。

想要实现的是在服务器端安装ocx控件,由服务器端的java后台程序去调用ocx控件对远端视频服务器进行操作,
这样客户端机器上就不用每台机器都安装ocx控件了。(想法是这样的)

如是开始寻找java中调用ocx控件的办法方法,jni、jacob....

但是试验下来发现调用像word、excel这些ActiveX控件是可以的,操作没有问题,换作视频的ocx控件就不能调用了。
请各位来帮忙解决解决。

JavaScript下调用的代码如下:(这种方式是Ok的)

HTML code
<HTML><HEAD><TITLE>视频调用</TITLE><script language="javascript" for="NVS5000" event="OnLoginNVSResult(nResult)">    //ocx对象的OnLoginNVSResult事件触发时    OnLoginNVS(nResult);</script><script type="text/javascript" language="javascript">function $() {  var elements = new Array();  for (var i = 0; i < arguments.length; i++)   {    var element = arguments[i];    if (typeof element == 'string')    {      element = document.getElementById(element);    }    if (arguments.length == 1)    {      return element;    }    elements.push(element);  }  return elements;}//初始化方法function init(){  try{    //为ocx对象属性赋值    $("NVS5000").URL          = "192.168.15.153";    //前端设备地址    $("NVS5000").Port         = 5200;            //端口号    $("NVS5000").NVSName    = "NVS";    $("NVS5000").UserName     = "admin";        //用户名    $("NVS5000").UserPswd     = "admin";        //密码        $("NVS5000").SetLoginMode(1);            //设置登录模式    $("NVS5000").Tips_Off();        $("NVS5000").AlarmBox_Off();    $("NVS5000").FullWnd_Off();    $("NVS5000").SocketProtocol=0;            //设置套接字协议    $("NVS5000").ChannelNum= 0;            //频道号        //登录前端设备    $("NVS5000").LoginNVS();    //浏览器状态显示    window.status = $("NVS5000").URL+":"+$("NVS5000").Port+" , Account:"+$("NVS5000").UserName+"/"+$("NVS5000").UserPswd;  }catch(e){}}//登录时触发方法function OnLoginNVS(nResult){      try{    if(nResult < 2)    {      switch(nResult)      {        case -1:                window.status = " 操作失败!";        break;        case -2:                window.status = " 请求被拒绝!";        break;        case -3:                window.status = " 登录用户已满!";        break;        case -4:                window.status = " 用户名或密码和系统不匹配!";        break;        case -5:                window.status = " 已经关闭IE!";        break;        case -6:                window.status = " 连接DDNS失败!";        break;        case -7:                window.status = " 获取设备信息失败!";        break;        default:            window.status = " 其他未知错误! " + nResult;        break;      }      return false;    }else{        //启动视频        $("NVS5000").StartView();            }  }catch(e){}}</script></HEAD><BODY onLoad="init()"><object name="NVS5000" ID="NVS5000" width="705" height="570"        CLASSID="CLSID:08353A15-031B-4FE1-9BF5-5B4F721BA61A"></object></BODY></HTML>


尝试在Java下使用jacob调用的代码如下:
Java code
package com.mdbq.jni;import com.jacob.activeX.ActiveXComponent;import com.jacob.com.ComThread;import com.jacob.com.Dispatch;import com.jacob.com.Variant;public class XDViewDemo{    public static void main(String[] args)    {        //初始化线程        ComThread.InitSTA();                ActiveXComponent activeX = new ActiveXComponent("CLSID:08353A15-031B-4FE1-9BF5-5B4F721BA61A");        Dispatch NVS5000 = (Dispatch)activeX.getObject();                Variant result = Dispatch.call(NVS5000,"LoginNVS","");                    //释放线程        ComThread.Release();            }} 



出错语句在:Variant result = Dispatch.call(NVS5000,"LoginNVS","");
(只要是调用ocx的方法就会出错。)

eclipse控制台下的错误如下:
Java code
Exception in thread "main" com.jacob.com.ComFailException: A COM exception has been encountered:At Invoke of: LoginNVSDescription: 灾难性故障    at com.jacob.com.Dispatch.invokev(Native Method)    at com.jacob.com.Dispatch.invokev(Dispatch.java:858)    at com.jacob.com.Dispatch.callN(Dispatch.java:455)    at com.jacob.com.Dispatch.call(Dispatch.java:544)    at com.mdbq.jni.XDViewDemo.main(XDViewDemo.java:18)


请各位大大帮忙看看是什么问题?

[解决办法]
http://topic.csdn.net/t/20050826/17/4233746.html看看这个
[解决办法]
真有问题啊 。。
[解决办法]
探讨
用jacob操作word和Excel已经尝试过了,是成功的。

我主要是要用jacob来操作第三方提供的这个ocx控件,
但是操作失败,不太明白。

ocx控件在系统中已经注册,用js是可以操作成功的。

在想,有没有可能是使用jacob来操作的ocx必须是使用某种语言开发的。

想想也不应该啊。

[解决办法]
OCX是vb的控件么

本人理解这种东西类似 dll 应该不会需要固定的语言去调用 里面封装各种处理方法 规定了调用的数据格式和返回的数据格式 至于操作失败 要自己找找原因 多打印一些数据 看看 ocx的帮助文档 如果需要和ocx的客服研究一下

读书人网 >J2EE开发

热点推荐