Java Desktop.browse иногда возвращает «запрошенный ключ поиска не найден ни в одном активном контексте активации» - PullRequest
0 голосов
/ 06 июня 2011

Я действительно борюсь с этой проблемой, потому что она кажется случайной для меня. Когда я звоню,

Desktop.browse("some url");

Internet Explorer не будет отображаться. Сообщение об исключении выглядит следующим образом:

Запрашиваемый ключ поиска не найден ни в одном активном контексте активации.

Когда это происходит, это происходит последовательно, пока я не перезагружаю машину, но в конечном итоге это происходит снова.

Рабочие станции, которые, по-видимому, сталкиваются с этой проблемой, работают под управлением Windows XP с Internet Explorer 8, установленным в качестве браузера по умолчанию.

РЕДАКТИРОВАТЬ: я забыл упомянуть, что если я открою Internet Explorer напрямую и перейду к соответствующему URL, то он будет работать нормально.

РЕДАКТИРОВАТЬ 2: Это происходит, если Desktop.browse вызывается, а затем вызывается снова, по крайней мере, 15 минут спустя. Перезапуск приложения теперь, кажется, решает проблему.

1 Ответ

0 голосов
/ 08 июня 2011

Я сузил проблему и обнаружил, что это НАСТОЯЩАЯ причина, это никак не связано со временем.

java.awt.Desktop.browse("some url"); выдавал эту ошибку, потому что на предыдущем шаге в приложении ActiveXObject был открыт программно с использованием инфраструктуры JACOB.

Разработчик, написавший этот код с использованием этого ActiveXObject, вообще не стал выпускать свои ресурсы. По какой-то причине этот объект ActiveXObject в памяти препятствовал или искажал вызов Dispatch для браузера ОС по умолчанию в классе java.awt.Desktop. Я полагаю, это имеет смысл.

Я исправил это, объявив транзакцию 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();
}
...