浅论Java访问COM/ActiveX

Excel自动化实战:ActiveX/COM原理、多语言实现与避坑指南 在数据处理与报表生成领域,自动化操作Excel是提升效率的核心需求。其底层原理基于微软的COM(组件对象模型)技术,该技术定义了二进制级别的标准,允许不同编程语言通过接口调用Excel丰富的功能。ActiveX作为COM的一种具体实现,为外部程序提供了对Excel应用程序实例的完全控制权,从而实现从读写单元格、应用公式到生成图表等精细操作。这项技术的核心价值在于能够无缝衔接现有工作流,实现高度定制化的报表生成和数据处理自动化。在工程实践中,开发者常使用Python的pywin32、C#的COM Intero 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> Java作为一种跨平台的语言,在很多环境下都获得了成功。然而,在Windows平台下,Java的发展却受到了一定程度的限制。其中很重要的原因就是,目前Java对Windows构件模型的支持力度不够,使得Java程序很难复用Windows平台下丰富的构件资源,例如日历、制表、Word等各种控件(COM/ActiveX)。 Windows构件模型是基于COM的,目前JDK没有提供任何直接访问COM的类库。因此,如果需要访问这些资源,我们必须通过JNI实现。JNI是Java世界和其它语言间的一座桥,Java通过访问JNI定义的接口来获取服务。在JNI的另一面,我们可以通过C/C 或其它语言实现这些接口。通过本地语言C/C 我们可以创建COM构件,并且使用COM的服务,最后将结果返回给Java程序。 在这里,我们涉及到几个关键问题。 1)数据类型的转换。 Java和其它的语言定义的数据类型不尽相同,这使得我们需要对这些数据的进行类型转换。在Windows中,自动化COM对象使用VARIANT作为其主要数据类型。VARIANT类型是对普通类型的一个封装,我们很容易将它转换成Java对应得类型。例如,VARIANT中的VARIANT_BOOL可以直接对应Java中的boolean。但是,一些其它数据类型的转换看起来就比较麻烦,例如SAFEARRAY和一些指针。因此,在实现中通常在Java中定义一些Wrapper类型。 2)GUI处理 Windows下有大量ActiveX控件,都提供了界面服务。这些类的封装性都非常好,具有很高的复用性。这些类实现了IDispatch接口,因此它们的使用也比较简单。但是,Java的窗口管理与Windows的窗口管理有很大差异。Windows利用句柄管理窗口。Java通过窗口类管理,对于重型构件(AWT窗口),每一个构件都有一个同位体,即存在一个本地窗口与之对应。对于轻型构件(Swing的大部分类),它们都没有同位体。因此,我们可以考虑在重型构件上放置ActiveX控件。 以下我们给出一个例子说明,说明如何使用同位体技术,实现在Java的Panel上放置一个IE控件。 首先,在Java 程序中我们通过同位体的方法,获一个Panel的同位体的窗口句柄。其中句柄用一个int表示。



public int getHWND()  

{ 

int hwnd = 0; 

DrawingSurfaceInfo drawingSurfaceInfo = ((DrawingSurface)(getPeer())).getDrawingSurfaceInfo(); //获取同位体信息 

 

if (null != drawingSurfaceInfo)  

{ 

drawingSurfaceInfo.lock(); 

Win32DrawingSurface win32DrawingSurface = (Win32DrawingSurface)drawingSurfaceInfo.getSurface(); 

hwnd = win32DrawingSurface.getHWnd();//获取同位体窗口句柄 

drawingSurfaceInfo.unlock(); 

} 

return hwnd; 

} 



然后,我们在通过JNI方法,将这个句柄传递给C/C 程序。C/C 程序通过这个句柄创建ActiveX,这样就可以实现将IE的ActiveX放在Java的Panel中。该例子使用ATL,并使用了相关的数据类型,如CComPtr等。



//产生IE控件 

void CreateIEControl(ThreadParam *pThreadParam) 

{ 

AtlAxWinInit(); 

// 第2个参数表示控件的ProgID或者 UUID,此例中使用IE控件。 

HWND hwndChild = ::CreateWindow("AtlAxWin", 

"Shell.Explorer.1",  

WS_CHILD|WS_VISIBLE, 

0,0,0,0, 

pThreadParam.hwnd,NULL,  

//其中pThreadParam.hwnd就是在Java中获取得据柄,作为父窗口。 

::GetModuleHandle(NULL), 

NULL); 

 

IUnknown *pUnk = NULL; 

AtlAxGetControl(hwndChild,&pUnk); 

 

//让IE访问pThreadParam.szURL所代表的URL 

CComPtr spBrowser; 

pUnk->QueryInterface(IID_IWebBrowser2, (void**)&spBrowser); 

if (spBrowser) 

{ 

CComVariant ve; 

CComVariant vurl(pThreadParam.szURL); 

spBrowser->put_Visible(VARIANT_TRUE); 

spBrowser->Navigate2(&vurl, &ve, &ve, &ve, &ve); 

} 

} 



3)事件通知 在COM中,外部事件通知是通过可连接对象实现的,客户程序通过访问COM组件的出接口,以实现登记一个事件的接收器。这种事件通知模式和Java的事件代理模式非常类似。因此,如果要在Java中实现COM的事件通知,就要在Java程序中实现自定义事件监听类,并将COM的事件接收器登记在Java程序中。这样,COM的事件就可以通知到Java程序。 本文只是浅析了Java访问COM的基本原理,在实际应用中,虽然可能有不同的解决方案,但基本原理都上文所述。另外,一些机构和个人提供了一些Java和COM的软件包,使得这种访问更加方便。例如,JavaCom 、Jacob和IBM提供的eclipse软件包等等。
java调用com组件实例 java调用com组件实例,使用jacb访问com对象 立即下载

相关推荐

JAVA调用COM组件

JAVA调用COM的JACOB.JAR和JACOB.DLL文件

java调用COM组件的几种工具

java调用COM组件的几种工具

pdw2009的专栏 1万+

微积分,用编程理解高数(python,C,C++)

很好理解,导数中,x是哪一点的导数,dx是精准度,y等于f(x)即函数。导数结果就是瞬时变化率。积分很好理解,a为下限,b为上限,y为函数,结果就是y=f(x)下a到b的面积。只要用定积分代入a=0,b=10(10s)y=x(1*x=1)就得到结果。F(x)为原函数,即微分后的函数是f(x)dx,微分前是F(x)一列车初始速度为10m/s,加速度为。才几十行代码,微积分也不是很难啊。,问速度达到20时车走了多少米。

linhhanpy的博客 1181

java com组件开发_COM组件和调用详细教程

一、引言实验目的:构建一个com组件,该组件存储了10000个12位的验证码;输入一个验证码,组件返回该验证码是否正确(是否是10000个其中之一);输入一个字符串,返回一个对应的映射的验证码(映射方法自己定义)。二、环境Windows 10 ×64Visual Studio 2015IDEA 2018.1.5jacob-1.19三、实验步骤1.C#写com组件以管理员身份运行VS新建->项...

weixin_39884492的博客 3677

电磁炉线圈加热仿真全流程:用Ansys Maxwell分析涡流效应与热损耗

本文详细介绍了使用Ansys Maxwell进行电磁炉线圈加热仿真的全流程。通过构建2D轴对称涡流场模型,深入分析了高频下的涡流效应、趋肤效应与热损耗分布,为优化线圈设计、提升加热效率与均匀性提供了量化依据和实用指南。

sss66的博客 972

nRF5340双核实战:从Zephyr环境搭建到蓝牙协议栈部署

本文详细介绍了nRF5340双核处理器的开发实践,包括Zephyr环境搭建、蓝牙协议栈部署及双核协同工作配置。通过实战案例展示了如何利用nRF5340的双核异构架构提升蓝牙应用性能,并提供了调试技巧与资源优化建议,帮助开发者高效实现低功耗蓝牙设备开发。

weixin_42525385的博客 382

java 调用 Com

二、java 调用 Com   部署jacob   1、在开发环境中引入jacob.jar   2、拷贝jacob-1.15-M3-x86.dll 文件到 C:\Windows\System32目录,如果是Web应用的话还需要拷贝到jdk1.5.0_16\bin目录(jdk安装目录下的bin目录)   java调用代码   Code highlighting produced by Ac

u014131893的专栏 526

用数据分析优化彩票决策:放弃预测,专注理性投入

彩票本质上是负和博弈的概率系统,其核心并非号码预测,而是对玩法规则、返奖率(RTP)、投入策略与心理约束的量化决策。基于组合数学与二项分布的分析方法,可精确计算各奖项概率、评估不同玩法的实际回报效率,并构建个人资金-风险-目标模型。数据的价值不在于打破随机性,而在于识别非随机环节——如奖池跃升期的RTP波动、固定奖的保底收益、冷热号背后的分奖博弈结构。这种以决策优化为导向的数据实践,适用于将彩票视为受控实验的理性参与者,而非追求玄学中奖的投机者。

frank1998819 644

java com组件开发_实现通过COM组件方式实现java调用C#写的DLL文件的完整demo

最近因为工作需要,客户那边工程师使用的是JAVA语言开发的程序,我们这边平台中是用C#语言开发的,因为有些操作必须统一,所以我在网上查找解决方法,自己也实践过,在这里做个笔记吧,分享一下。一、使用C#编写com组件开发环境 :VS20171、新建工程:CalcTest(类库项目,根据自己喜好需要取工程名,框架我这里使用的是:.NET Framework 4 ,你可以根据自己的来选。 (注:下面红色...

weixin_36354492的博客 873

把 SAP Fiori Launchpad Designer 的 Catalog 与 Group 传输讲透:从 CONF、CUST 到 Transport Request 的完整理解

SAP Fiori项目中,catalog和group的传输问题往往源于对FLPD层次模型的理解不足。FLPD包含configuration(系统级)和customizing(客户端级)两个层面,分别对应workbench request和customizing request传输方式。常见误区包括:混淆/UI2/FLPD_CONF和/UI2/FLPD_CUST入口、未提前创建传输请求、不了解层次覆盖机制(customizing会覆盖configuration)。当客户端修改configuration层的对象

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 102

【商城实战(77)】商城智能客服系统搭建指南:选型与集成全攻略

本文聚焦商城智能客服系统,阐述其在电商市场提升用户体验、优化服务流程的重要性。深入评估智齿客服、网易七鱼等主流产品,结合 uniapp、Element plus 等技术栈探讨接入思路。经分析商城业务规模、用户群体及业务场景等需求,选定智齿客服。详细介绍从前后端接入到数据库操作、基本信息(欢迎语、知识库分类)配置的实现过程。展望未来,智能客服将借助 AI 进步实现更精准交互、多模态融合,深度集成商城业务系统,提升性能与扩展性,助力商城发展。

邓邓子的博客 1477

java 与com 相互调用的方法比较

在使用java 与com 相互调用的方法中采用jacob的方法,比jcom要好用的得多   如下是C++ Com 组件的定义文档 IDL   Xml代码             JCOM 的调用方式:   Java代码   Jacob调用方式:   Java代码   对于传入类型的支持,对于jcom,由于文档是日文的看的不是很懂,而且,在传入的参数列表中,不能有Long类型,有的

Bobit - 优快云博客 4056

使用MiniExcel.SaveAsByTemplate快速地保存百万数据

该代码展示了如何使用MiniExcel快速生成并导出百万级销售数据。核心方法GenerateLargeData()可生成指定数量的随机销售记录,包含客户名、日期、VIP状态、积分等20个字段。通过随机函数模拟真实数据分布,并支持自定义数据量(默认100万条)。配合Excel模板使用MiniExcel.SaveAsByTemplate()方法,能高效地将大数据量导出为Excel文件,且处理速度极快。代码结构清晰,包含数据生成、随机日期辅助方法和数据模型类,适合需要批量生成测试数据或导出大型报表的场景。

大坡3D软件开发 255

com与activex

一、ActiveX的由来ActiveX最初只不过是一个商标名称而已,它所涵盖的技术并不是各自孤立的,其中多数都与Internet和Web有一定的关联。更重要的是,ActiveX的整体技术是由Microsoft的COM(Component Object Model,组件对象模型)构筑的。但不要误认为ActiveX是定义了所有包含基于COM的技术。COM与Microsoft Office和Wind

pengdean的专栏 1634

进阶篇第8节:寄存器压力——寄存器溢出对性能的影响及优化

**摘要:GPU寄存器是最快的存储单元(1周期访问),但数量有限。过高的寄存器使用会导致溢出(变量存入慢速本地内存)或降低占用率(减少并发线程数),严重影响性能。优化方法包括复用变量、使用共享内存替代寄存器数组、限制寄存器数量(--maxrregcount)等。实际测试显示,将寄存器使用从48个降至24个可使性能提升37%。分析工具如Nsight Compute可帮助检测寄存器压力。面试常见问题涉及寄存器溢出的检测与优化策略。

PeterPan的博客 95

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ActiveX and Com

一、ActiveX的由来ActiveX最初只不过是一个商标名称而已,它所涵盖的技术并不是各自孤立的,其中多数都与Internet和Web有一定的关联。更重要的是,ActiveX的整体技术是由Microsoft的COM(Component Object Model,组件对象模型)构筑的。但不要误认为ActiveX是定义了所有包含基于COM的技术。COM与Microsoft Office和Wind

nemojiang的专栏 867

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java访问COM的基本原理

  Java作为一种跨平台的语言,在很多环境下都获得了成功。然而,在Windows平台下,Java的发展却受到了一定程度的限制。其中很重要的原因就是,目前Java对Windows构件模型的支持力度不够,使得Java程序很难复用Windows平台下丰富的构件资源,例如日历、制表、Word等各种控件(COM/ActiveX)。 Windows构件模型是基于COM的,目前JDK没有提供任何直接访问COM

§为艺术而技术§ 1344

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

JACOB终极指南:轻松实现Java与COM组件桥接

JACOB是一个强大的**Java-COM桥接库**,能够让你在Java应用程序中无缝调用Microsoft Windows的COM自动化组件。通过使用JNI技术,JACOB为Java开发者提供了与Windows DLL和COM库通信的能力,无需编写复杂的JNI代码。 ## 🔥 什么是JACOB项目? JACOB(Java-COM Bridge)是一个开源的Java库,专门用于解决**Jav

gitblog_00710的博客 835

COM、ActiveX与ActiveXDLL和ActiveXEXE:探索组件化开发的潜力(附图代码及关系详解)

COM、ActiveX、ActiveX DLL和ActiveX EXE是软件开发中非常重要的技术。它们通过提供标准的组件交互方式,实现了代码的重用和功能的扩展。这些概念你了解吗

李赛男 1850

ActiveX控件

ActiveX一、ActiveX的由来 ActiveX最初只不过是一个商标名称而已,它所涵盖的技术并不是各自孤立的,其中多数都与Internet和Web有一定的关联。更重要的是,ActiveX的整体技术是由Microsoft的 COM(Component Object Model,组件对象模型)构筑的。但不要误认为ActiveX是定义了所有包含基于COM的技术。COM与Microsoft Offi

zhongchengli的专栏 793

ActiveX综述 升级 CAB创建

<spanlang=EN-US><spanstyle=mso-spacerun:yes> TOC /o "1-3" /h /z /u <spanstyle=mso-element:field-separator>ActiveX技术综述... <spanstyle=color:windowtext;display:none;mso-hide:screen;text-de

jamestaosh 4927
上一篇: 用Java实现基于CORBA的自动负载均衡
下一篇: 三菱将推出支持Java的汽车导航系统
java169
博客等级 码龄19年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值