Мы разработали COM-объект, который представляет собой файл .exe и работает в фоновом режиме. Мы пытаемся подключиться к объекту, используя JACOB.
При запуске создайте activeXcomponent и вызовите метод Connect объекта. Метод Connect возвращает экземпляр класса (который написан внутри COM-объекта) по ссылке, называемой здесь «дескриптором».
component=new ActiveXComponent("ServiceName.className");
Dispatch.call(component,FN_CONNECT,sourceType,additionalParams,handle);
Этот дескриптор хранится в переменной уровня класса. Экземпляр этого класса JAVA хранится в пуле соединений и позже используется для будущих вызовов функций. Это делается для того, чтобы следующие вызовы вызывались для объектов / указателей, которые уже инициализированы.
Когда должен быть инициирован вызов выборки данных, он вызывает другой метод с именем fetchData и принимает запрос в качестве входных данных. Возвращает код ошибки и ответ по ссылке. Ссылка на объект компонента осуществляется через экземпляр класса JAVA, который был сохранен в пуле соединений.
Variant response = new Variant("", true); //String
Variant errorCode = new Variant(0, true);
Dispatch.call(component,FETCH_DATA,handle,functionCode,request,response,errorCode);
Теперь, тестируя в локальной среде, мы обнаружили, что все работает нормально, как и ожидалось, и не исключение. Однако в клиентской среде мы получаем следующую ошибку:
Caused by: com.jacob.com.ComFailException: Can't map name to dispid: fetchData
at com.jacob.com.Dispatch.invokev(Native Method)
at com.jacob.com.Dispatch.invokev(Dispatch.java:625)
at com.jacob.com.Dispatch.callN(Dispatch.java:453)
at com.jacob.com.Dispatch.call(Dispatch.java:541)
Нам удалось заметить, что один и тот же код прекрасно работает с одной попытки и завершается неудачно при следующей перезагрузке. Это поведение совершенно случайно, поэтому его трудно отследить.
Обратите внимание:
Мы где-то читаем, JACOB Library плохо себя ведет в многопоточной среде. Это правда?
Если да, что нужно сделать, чтобы все заработало как положено.
Если нет, то почему это исключение выбрасывается случайным образом?
Любая идея / помощь / руководство полезна. Заранее спасибо!
Задача ещё не решена.
Других решений пока нет …