jacob访问ocx控件方法和遇到的问题
最近在进行摄像机的二次开发,摄像机厂商提供了使用C++开发的ocx控件:所以尝试使用jacob来进行访问。
操作步骤如下:
1, 从官网(http://sourceforge.net/projects/jacob-project/)下载了1.18版本的包。
2,jacob.jar放在 C:\Program Files\Java\jdk1.7.0_25\jre\lib\ext jacob-1.18-M1-x86.dll和 jacob-1.18-M1-x64.dll 放在 C:\Program Files\Java\jdk1.7.0_25\bin
3,jacob.jar添加到工程中。
4,将**.ocx放到System32目录下,并用regsvr32注册到系统
5, java代码如下:
ActiveXComponent com = new ActiveXComponent("NETVIDEOACTIVEX23.NetVideoActiveX23Ctrl.1");
Dispatch disp = (Dispatch)com.getObject();
Dispatch.call(disp,"Logout");
出现了异常
com.jacob.com.ComFailException: A COM exception has been encountered:
At Invoke of: Logout
Description: 8000ffff / 灾难性故障
at com.jacob.com.Dispatch.invokev(Native Method)
at com.jacob.com.Dispatch.invokev(Dispatch.java:625)
at com.jacob.com.Dispatch.callN(Dispatch.java:453)
6,看到网上有说在ocx中加一个函数,跳过加载时检查是否允许调用的判断(http://lvqingboy-163-com.iteye.com/blog/769358),就把公司以前用的一个ocx加了函数再用jaboc试了一次,能正常运行。
7,知道这个问题的原因了,因为找摄像机厂商比较麻烦,我们已经采取了其他方案,这个方案就不做了。
8,如果要修改这个问题,需要摄像机厂商,添加COleControl.IsInvokeAllowed (DISPID)函数,跳过允许调用的检查,接口就可以正常调用了;
下面是其他人在使用jacob时遇到的问题,记录如下:
1、在测试接口的过程中,出现了过jvm 栈溢出的异常信息(忘记截图了),经过检查,在ocx中使用了一个比较大的局部变量,造成jvm栈内存溢出异常,将ocx的内存改为堆内存,就正常了,没有尝试过修改jvm的参数配置,不知道会不会有效果;
2、引用传递,ocx中使用了引用传递参数作为返回值,在java中调用的时候需要按下面这种写法,才能正常返回数据,否则会报参数类型错误的异常
Variant userId = new Variant(new Integer(0), true);
Dispatch.call(dispatch, "GetOneUserID",userId);
3、因为是B/S结构程序(Spring、Struts、Hibernate),将jacob-1.17-M2.dll放到System32目录下是不行的,需要放到Tomcat的bin目录下面才能正常使用。
结论:java来调用ocx本来就算是很偏门的东西,而且确实不是java的长处。即便能成功,对ocx也有颇多要求,而且还牺牲了java跨平台的特性
jacob访问ocx控件方法和遇到的问题的更多相关文章
- Java 通过 jacob调用OCX控件
安装好要调用的ocx驱动,并通过注册表查询其对应的clsid. 下载jacob-1.18解压,将jacob-1.18-x86.dll文件复制到D:\Program Files (x86)\Java\j ...
- asp.net访问母版页控件方法
一.使用多种方式为内容页加载母版页默认情况下是给单个内容页指定一个母版页加载,当多个内容页需加载到同一个母版页时,我们可以通过配置文件为多个内容页批量加载母版页,另外,还可以在PreInit事件中动态 ...
- FAQ:win7和win8 64位注册ocx控件方法
win7/win8 问题所在: 64位的系统一般都是可以安装32位程序的, 执行 C:\Windows\SysWOW64\regsvr32.exe 而不是 C:\Windows\Sys ...
- 多线程访问winform控件出现异常的解决方法
一. 多线程访问winform控件出现异常的解决方法 1. 问题描述<1> 如果创建某控件的线程之外的其他线程试图调用该控件,则会引发一个 InvalidOperationExcept ...
- PHP调用OCX控件的具体方法
需要设置php.ini文件,找到这行com.allow_dcom=true,把com组件支持启用 使用PHP调用OCX控件,本不是个难题,但现实中采用flash回避的方法更通用.真正使用ocx的不多, ...
- Delphi安装/卸载OCX控件的方法
delphi 安装卸载ocx 请参见 如下 http://blog.csdn.net/xt_chaoji/article/details/7027298 打开Delphi,关闭所有项目. 1. ...
- 在 浏览器中调用外接设备— —手写板 【win10 x64 手动注册ocx控件的方法】
PPAXSignToolSDK.ocx 浏览器下使用手写板时调用的控件,使用前必须先注册,,不然浏览器下版本无法正常工作. ocx 控件在安装包运行时会自动注册,如果安装包没有注册成功,需要进行手动注 ...
- [转]C#开发ActiveX控件,.NET开发OCX控件案例
引自:百度 http://hi.baidu.com/yanzuoguang/blog/item/fe11974edf52873aaec3ab42.html 讲下什么是ActiveX控件,到底有什么 ...
- VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程
开篇语:最近在弄ocx控件发布到asp.net网站上使用,就是用户在使用过程中,自动下载安装ocx控件.(此文章也是总结了网上好多人写的文章,我只是汇总一下,加上部分自己的东西,在这里感谢所有在网 ...
随机推荐
- 将系统日期转化为sharepoint日期
string currentDate = SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.Now.Date);
- Linux VIM python 自动补全插件:pydiction
Pydiction 可以是我们使用Tab键自动补全Python代码在Vim,是一款非常不错的插件. Pydiction不需要安装,所有没有任何依赖包问题,Pydiction主要包含三个文件. pyth ...
- 批量转换word文档到pdf文件
最近在整理每周的工作记录.因为每周的工作记录大都是单独的word文件,有时候忘记了也不容易找出来,一个个打开查找太费劲,因此想着把这些文件通过word2016的另存为功能转换为pdf,然后永Acrob ...
- WEB系统技术开发方向
1. UI框架:要可以结合jquery+自定义服务器控件开发一套UI框架: 2.WEB报表设计器:用js开发一套可以自定义报表设计器: 3.WEB自定义表单+工作流设计器: 4.WEB打印组件: 5. ...
- 二维树状数组——SuperBrother打鼹鼠(Vijos1512)
树状数组(BIT)是一个查询和修改复杂度都为log(n)的数据结构,主要用于查询任意两位之间的所有元素之和,其编程简单,很容易被实现.而且可以很容易地扩展到二维.让我们来看一道很裸的二维树状数组题: ...
- 7zip self-extracted executable: To extract file to specific directory
1) Install 7-zip (7zS.sfx will be installed to C:\Program Files\7-Zip): http://7zsfx.solta.ru/en/ 2) ...
- 九度OJ 1386 旋转数组的最小数字 【算法】
题目地址:http://ac.jobdu.com/problem.php?pid=1386 题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋 ...
- 第28条:利用有限制通配符来提升API的灵活性
参数化类型是不可变的.对两个不同类型T1和T2而言,List<T1>与List<T2>没有父子类型关系. 考虑: public class Stack<E> { p ...
- Sheepdog HTTP API
1.sheepdog中http simple storage中nginx后台配置文件模板留存: events { worker_connections 1024;} http { server { l ...
- Ajax跨域请求——PHP服务端处理
header('Access-Control-Allow-Origin:*'); // 响应类型 header('Access-Control-Allow-Methods:POST'); // 响应头 ...