SWT中ole/activex实践--操作word的一个例子
http://setting.iteye.com/blog/747295
————————————————————————————————————————————————
这几年,做了很多word/excel/ppt方面的开发,特别是office插件/vsto/oba,和各种支持activex的ole嵌入环境下的应用。
基本上,了解了office对象模型,就可以在支持ole的环境下游刃有余的使用接口进行开发了。
不过office本身是不支持ole的,一般需要一个native的“外壳”包裹住,然后再在我们开发的环境下ole这个外壳。
例如,web页面或一般环境中,使用dsoframer。SWT中使用OleClientSite。
这里讲讲OleClientSite。
windows下,SWT中(OS类)封装了绝大部分常见的win32 api。而且SWT中的组件都是系统原生的,或是组合的,
所以调用Activex的窗口并交互成为了可能(AWT可以拿到原生窗口的句柄,也能别别扭扭的实现,纯swing不是原生的,所以是拿不到的),
OleClientSite封装了调用Activex并交互的细节。
大概的方式是:传给OleClientSite一个Activex的progID,初始化一个Activex,并挂接到制定的composite上,
然后根据容器对Activex调用设置大小长宽。接着,通过一个OleAutomation封装一个Activex中的原生对象的引用指针,
然后可以用getIDsOfNames根据属性名或是方法名获取对应id(做过mfc/atl-activex的都知道这个在IDL文件中注册的id)。
然后可以调用OleAutomation的 getProperty/setProperty/invoke/invokeNoReply 等方法,获取属性或调用相应的方法。
当然返回结果可能还是原生对象,可以继续用OleAutomation包装,然后重复上面的过程。
SWT还提供了一个通用的类型包装器,用来原生的几种常见c类型和java类型的转换:Variant。(很像vb里的那个吧)
------------------------------------- 想了解的看SWT源码和com本质论去 -----------------------------------
附件是一个嵌入word,并定位word文档中的字符串的例子。
ListOLE是传递一个OleAutomation,列出所有方法的工具类。源于网上。
txt文件夹提供了word.Application 和 word.Document对象的所有com接口方法和属性。
运行Word.java,展示word文件:
点击menu1,搜索定位字符串bbbbb:
相关文章
- 4次迭代,让我的 Client 优化 100倍!泄漏一个 人人可用的极品方案!
- ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 用javascript在客户端删除某一个cookie键值对 input点击链接另一个页面,各种操作。 C# 往线程里传参数的方法总结 TCP/IP 协议 用C#+Selenium+ChromeDriver 生成我的咕咚跑步路线地图 (转)值得学习百度开源70+项目
- Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作
- C# PDF Page操作——设置页面切换按钮 C# 添加、读取Word脚注尾注 C#为什么不能像C/C++一样的支持函数只读传参 web 给大家分享一个好玩的东西,也许你那块就用的到
- 一个非常简单用.NET操作RabbitMQ的方法
- Word控件Spire.Doc 【文档操作】教程(十五、十六):在 C# 中克隆一个 word 文档/ 在 C# 中从 Word 文档中检测和删除 VBA 宏
- JQ,js 滚动列表,JQ操作获取最后一个元素,并移动到内容标签头部无限循环
- Google Earth Engine ——Google Earth Engine ——ALOS World 3D - 30m (AW3D30) 是一个全球数字表面模型 (DSM) V2_1版本数据集
- 数据操作-将一个临时生产的CSV转换为Tensor(向量)
- mosh:一个基于 SSH 用于连接远程 Unix/Linux 系统的工具
- 即截即贴,推荐一个提升截图对比效率的工具Snipaste
- android2.3 View视图框架源码分析之一:android是如何创建一个view的?
- oracle在不知道用户密码的时候,怎么样跳转到另外一个用户执行操作后并不影响该用户?
- write -在一个文件描述符上执行写操作
- 如何快速实现一个基于Nginx的网站监控场景 – 操作篇
- sql server 2000 一个表的数据插入到三个相关联表中,一条一条的插入
- 死侍在新片中,扮演了一个 AI 驱动的 NPC
- [Oracle][Metadata]如何查找与某一个功能相关的数据字典名
- 美网络安全公司:小心!又一个勒索病毒来袭!
- 【数字IC验证进阶】以一个实例,快速上手python脚本处理log的若干关键操作(#python、#正则表达式)
- Unity编辑器开发(四):实战、开发一个AB包编辑器工具
- C#定时执行一个操作
- 操作excel数据:一个合并单元格内容的实践
- 使用wxpython编写一个网易云音乐爬虫程序
- 构建一个高可扩展性javabean和jsp连接数据库操作
- 人人都能做的机器学习——autokeras项目,3行代码就能训练一个模型,傻瓜式操作,分分钟学会训练模型
- 记录Python类与继承的一个错误
- 练习 2-6 编写一个函数setbits(x, p, n, y),该函数返回对x执行下列操作后的结果值:将x中从第p位开始的n个(二进制)位设置为y中最右边n位的值,x的其余各位保持不变。
- 算法2.1 假设利用两个线性表LA和LB分别表示两个集合A和B(即线性表中的数据元素即为集合中的成员),现要求一个新的集合A=AUB。这就要求对线性表作如下操作:扩大线性表LA。。。