Java Desktop.browse偶尔返回“在任何活动的激活上下文中找不到请求的查找键”

时间:2011-06-06 19:35:53

标签: java internet-explorer activexobject jacob

我真的在努力解决这个问题,因为它似乎随机发生在我身上。当我打电话时,

Desktop.browse("some url");

无法显示Internet Explorer。异常消息如下,

  

在任何活动的激活上下文中找不到请求的查找密钥。

当它发生时,它会一直发生,直到我重新启动机器,但最终会再次发生。

似乎遇到此问题的工作站正在运行Windows XP,并将Internet Explorer 8设置为默认浏览器。

编辑:我忘了提到如果我直接打开Internet Explorer并导航到相关的网址,那么它将正常工作。

EDIT2:如果调用Desktop.browse,然后至少在15分钟后再次调用,则会发生这种情况。现在重新启动应用程序似乎可以解决问题。

1 个答案:

答案 0 :(得分:0)

我缩小了问题范围并发现了导致这种情况的真正原因,它毕竟与时间无关。

java.awt.Desktop.browse("some url");抛出此错误,因为在应用程序的上一步中,使用JACOB框架以编程方式打开了ActiveXObject。

使用这个ActiveXObject编写此代码的开发人员根本不打算放弃他的资源。出于某种原因,内存中的ActiveXObject阻止或搞砸了java.awt.Desktop类中的默认OS浏览器的Dispatch调用。我认为这是有道理的。

我通过声明一个JACOB事务并通过释放finally块中的所有资源来解决这个问题:

ActiveXObject ao1 = null;
ActiveXObject ao2 = null;
ComThread.initMTA();
try {
  ao1 = new ActiveXObject("blaa.blaa");
  ao2 = new ActiveXObject("haa.haa");
  // business logic
} finally {
  if (ao1 != null) {
    ao1.safeRelease();
    ao1 = null;
  }
  if (ao2 != null) {
    ao2.safeRelease();
    ao2 = null;
  }
  ComThread.Release();
}