com的线程回收不由java垃圾回收器进行处理,因此,每new一次jacob提供的类就要分配一定大小的内存给该操作,new出来的这个com对象在使用结束之后产生的垃圾java是无法回收的,new出来的对象越来越多,内存溢出就不可避免了,即使增加jvm内存也只是暂时的,迟早这些对象会把内存用完。既然java不能回收这些垃圾,那么com组件也应该提供了回收垃圾的方法,最后得知是ComThread.InitSTA()和ComThread.Release()方法,这两个方法其实就是初始化一个线程和结束这个线程,在创建com对象的时候初始化一个线程来运行这个对象,这个对象使用结束之后再结束线程,

/** * @fileName MSWordManager.java

* @description 该类用于查找word文档指定位置并将图片插入

* @date 2011-10-21 * @time * @author wst */

public class MSWordManager {

private Logger log = Logger.getLogger(MSWordManager.class);

// word文档

private Dispatch doc;

// word运行程序对象

private ActiveXComponent word;

// 所有word文档集合

private Dispatch documents;

// 选定的范围或插入点

private Dispatch selection;

public static int instanceSize=3;

//一个线程存放的MSWordManager数量

public MSWordManager(int index) {

if (word == null) {

word = new ActiveXComponent("Word.Application");

//为true表示word应用程序可见

word.setProperty("Visible", new Variant(false));

}

if (documents == null){

documents = word.getProperty("Documents").toDispatch();

}

if(index==0){

ComThread.InitSTA();

//初始化一个线程并放入内存中等待调用 } }

/** * 打开一个已经存在的文档 * @param docPath 要打开的文档

* @param key 文本框的内容,根据该key获取文本框当前位置

* @date 2011-12-9 * @author wst */

public void openDocumentAndGetSelection(String docPath, String key) {

try{

closeDocument() // 打开文档

doc = Dispatch.call(documents, "Open", docPath).toDispatch();

// shapes集合

Dispatch shapes = Dispatch.get(doc, "Shapes").toDispatch();

// shape的个数

String Count = Dispatch.get(shapes, "Count").toString();

for (int i = 1; i <= Integer.parseInt(Count); i++) {

// 取得一个shape

Dispatch shape = Dispatch.call(shapes, "Item", new Variant(i)).toDispatch();

// 从一个shape里面获取到文本框

Dispatch textframe = Dispatch.get(shape, "TextFrame").toDispatch();

boolean hasText = Dispatch.call(textframe, "HasText").toBoolean();

if (hasText) {

// 获取该文本框对象

Dispatch TextRange = Dispatch.get(textframe, "TextRange").toDispatch();

// 获取文本框中的字符串

String str = Dispatch.get(TextRange, "Text").toString();

//获取指定字符key所在的文本框的位置

if (str != null && !str.equals("") && str.indexOf(key) > -1) {

//当前文本框的位置

selection = Dispatch.get(textframe, "TextRange").toDispatch();

// 情况文本框内容

Dispatch.put(selection, "Text", ""); break; } }

} }catch(Exception e){ log.error(e); return; }

}

/** * 在当前位置插入图片

* @param imagePath 产生图片的路径

* @return 成功:true;失败:false */

public boolean insertImage(String imagePath) {

try{

Dispatch.call(Dispatch.get(selection, "InLineShapes").toDispatch(),"AddPicture", imagePath);

}catch(Exception e){

log.error(e); return false;

}

return true; }

//关闭文档 public void closeDocument()

{ if (doc != null) { Dispatch.call(doc, "Close"); doc = null; }

}

//关闭全部应用

public void close(int index) {

if (word != null) { Dispatch.call(word, "Quit"); word = null; }

selection = null; documents = null; if(index==instanceSize){

//释放占用的内存空间,因为com的线程回收不由java的垃圾回收器处理

ComThread.Release(); }

}

}

jacon的更多相关文章

随机推荐

  1. Android判断GPS是否开启和强制帮用户打开GPS

    引子:在我们的应用为用户提供定位服务时,通常想为用户提供精确点的定位服务,这是需要用户配合的.我们必须先检测用户手机的GPS当前是否打开,若没打开则弹出对话框提示.用户若不配合我们也没办法,只能采用基 ...

  2. weblogic.security.SecurityInitializationException: Authentication for user weblogic denied(详见下面具体报错信息)

    在使用nodemanager启动受管服务器时,报错 <Dec 25, 2016 5:54:31 PM CST> <Error> <NodeManager> < ...

  3. The The Garbage-First (G1) collector since Oracle JDK 7 update 4 and later releases

    Refer to http://www.oracle.com/technetwork/tutorials/tutorials-1876574.html for detail. 一些内容复制到这儿 Th ...

  4. html小知识点汇总(浏览器导航上显示图标、div无高度时试着清除浮动、文字环绕图片、字体加粗、div按百分比分、已有的不合适的class,针对特定的标签进行修改)

    1.新点击的网页,在浏览器导航上显示图标: 像这种效果: <head> <meta charset="UTF-8"> <meta name=" ...

  5. 【安全测试】sqlmap安装方法

    参考资料:http://jingyan.baidu.com/article/60ccbceb64cc2064cbb19748.html SQLMap是利用Python语言写的,所以需要将Python这 ...

  6. angular-ui-router中的$stateProvider设置

    $stateProvider .state('contacts.list', { url: '', templateUrl: 'contacts.list.html' }) .state('conta ...

  7. 转,Oracle中关于处理小数点位数的几个函数,取小数位数,Oracle查询函数

    关于处理小数点位数的几个oracle函数() 1. 取四舍五入的几位小数 select round(1.2345, 3) from dual; 结果:1.235 2. 保留两位小数,只舍 select ...

  8. Vue2.X的状态管理vuex记录

    记住上述的顺序情况:想要改变state,只能通过Mutation,虽然action可以直接改变state,这样会使每个状态可以方便的跟踪和记录(用Devtools跟踪) vue Method   -- ...

  9. [原创]C#应用WindowsApi实现查找(FindWindowEx)文本框(TextBox、TextEdit)。

    /// <summary> /// 获取文本框控件 /// </summary> /// <param name="hwnd">文本框所在父窗口 ...

  10. mysql5.7碰到的坑

    日志输出时区问题 输出日志有这些信息2016-08-16T02:23:09.831827Z 112241 [Note] Aborted connection 112241 to db: 'test' ...