jacob 调用ocx

场景:

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: LoginNVS
Description: 灾难性故障

    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.****.net/t/20050826/17/4233746.html看看这个
------解决方案--------------------
真有问题啊 。。
------解决方案--------------------
探讨
用jacob操作word和Excel已经尝试过了,是成功的。

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

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

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

想想也不应该啊。

------解决方案--------------------
OCX是vb的控件么 

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