2012-05-11 2 views
8

Мы работаем на Windows 7 Enterprise, SP1, 64bit. Мы только что установили Java 7 на всех наших машинах, что вызывает следующую проблему:Java 7: COM-API не работает с Quality Center (OTAClient.dll), но работает с Java 6

Когда моя программа пытается связаться с OpenTestArchitecture-API из Центра качества, он не создает ActiveX-компонент. Я использую JACOB в качестве моей библиотеки Java-COM. Обновление до последней версии JACOB ничего не меняет.

Следующий тест работает с jdk1.6.0_24 (32 бит), но не с jdk1.7.0_04 (32 бит):

import java.io.File; 

import com.jacob.activeX.ActiveXComponent; 
import com.jacob.com.ComThread; 
import com.jacob.com.Dispatch; 
import com.jacob.com.LibraryLoader; 

public class JacobTest { 
    static { 
     File lib = new File("lib/" + LibraryLoader.getPreferredDLLName() + ".dll"); 
     System.setProperty(LibraryLoader.JACOB_DLL_PATH, lib.getAbsolutePath()); 

     System.out.println("JACOB_DLL_PATH = " + lib.getAbsolutePath()); 
     LibraryLoader.loadJacobLibrary(); 
    } 

    public static void main(String[] args) { 
     try { 
      // Excel: Works with jdk1.6.0_24 AND jdk1.7.0_04 
      System.out.println("new ActiveXComponent(\"Excel.Application\");"); 
      new ActiveXComponent("Excel.Application"); 

      // Quality Center OTAClient: Only works with jdk1.6.0_24 
      System.out.println("ActiveXComponent component = new ActiveXComponent(\"TDApiOle80.TDConnection\");"); 
      ActiveXComponent component = new ActiveXComponent("TDApiOle80.TDConnection"); 

      System.out.println("ComThread.InitSTA();"); 
      ComThread.InitSTA(); 

      System.out.println("Dispatch.call(component, \"InitConnectionEx\", \"http://intranet/qcbin\");"); 
      Dispatch.call(component, "InitConnectionEx", "http://intranet/qcbin"); 
     } 
     catch (Exception exception) { 
      exception.printStackTrace(); 
     } 
    } 
} 

выход jdk1.6.0_24:

JACOB_DLL_PATH = C:\Development\Java\Test\JacobTest\lib\jacob-1.17-M2-x86.dll 

new ActiveXComponent("Excel.Application"); 
ActiveXComponent component = new ActiveXComponent("TDApiOle80.TDConnection"); 
ComThread.InitSTA(); 
Dispatch.call(component, "InitConnectionEx", "http://intranet/qcbin"); 

JDK1 .7.0_04 выход:

JACOB_DLL_PATH = C:\Development\Java\Test\JacobTest\lib\jacob-1.17-M2-x86.dll 

new ActiveXComponent("Excel.Application"); 
ActiveXComponent component = new ActiveXComponent("TDApiOle80.TDConnection"); 
com.jacob.com.ComFailException: Invalid access to memory location. 
    at com.jacob.com.Dispatch.createInstanceNative(Native Method) 
    at com.jacob.com.Dispatch.<init>(Dispatch.java:99) 
    at com.jacob.activeX.ActiveXComponent.<init>(ActiveXComponent.java:58) 
    at JacobTest.main(JacobTest.java:26) 

Оригинальный ComFailException-Message «не могут одновременно создать объект», но я редактировал следующий код в J acob Dispatch.cpp: (Я не трогал CoCreateInstance, я просто хотел бы знать, что HRESULT был)

// standard creation 
    hr = CoCreateInstance(clsid,NULL,CLSCTX_LOCAL_SERVER|CLSCTX_INPROC_SERVER,IID_IUnknown, (void **)&punk); 
    if (!SUCCEEDED(hr)) { 
    if (hr == REGDB_E_CLASSNOTREG) 
     ThrowComFail(env, "Can't co-create object: REGDB_E_CLASSNOTREG", hr); 
    if (hr == CLASS_E_NOAGGREGATION) 
     ThrowComFail(env, "Can't co-create object: CLASS_E_NOAGGREGATION", hr); 
    if (hr == E_NOINTERFACE) 
     ThrowComFail(env, "Can't co-create object: E_NOINTERFACE", hr); 
    if (hr == E_POINTER) 
     ThrowComFail(env, "Can't co-create object: E_POINTER", hr); 

    _com_error error(hr); 
    LPCTSTR errorText = error.ErrorMessage(); 

    ThrowComFail(env, errorText, hr); 
    return; 
    } 

Кто-нибудь есть ключ, что может быть проблема? Единственное различие заключается в том, что я переключаюсь между версией Java 6 и Java 7.

Большое спасибо за вашу помощь!

PS: Excel работает с обеими версиями, а переключатель com4j-Library ничего не меняет. (У меня есть com4j-тест, но я не отправлял это, потому что я уже писал достаточно кода)

Edit: Тот же тест работает с Windows XP, SP3 и Java 7.

+1

Непонятно, является ли исключение, которое вы получаете от исходного кода jacob, это «нарушение доступа к памяти» или HRESULT? –

+0

И если вы можете уточнить, воспроизводится ли такое же поведение с помощью com4j и java 7. –

+0

Исходное Jacob-Exception - «Невозможно создать совместное создание объекта». Поскольку это не говорит очень много, я попытался выяснить, какой результат функции CoCreateInstance в Native-Part. Сообщение об ошибке из этого метода - «Недопустимый доступ к ячейке памяти». Когда я использую com4j вместо Jacob, я получаю те же результаты: «Excel.Application» и «TDApiOle80.TDConnection» работает с Java 6, а Java 7 «Excel.Application» работает, но «TDApiOle80.TDConnection» этого не делает. – r3zn1k

ответ

2

Якоба DLL связана с jvm.dll (методы и структуры) от JRE. Поэтому я предполагаю, что Jacob DLL должен быть скомпилирован из источников с Java 7 для правильной загрузки Java 7 JRE.

Вы not alone, но я предполагаю, что слишком мало людей, уже работают Java 7 ...

Update: Я предлагаю вам исследовать первый с Process Monitor, если есть какая-либо библиотека или системные вызовы неудачи в вашем процессе Java, перед запуском самого процесса в отладчике ... Может быть, OpenJDK 7 тоже может попробовать попробовать, его нужно будет легче отлаживать, по крайней мере, для диагностики проблемы.

+0

Я уже создал jacob с java 7, но это ничего не меняло ... Во всяком случае, спасибо за ваш ответ! – r3zn1k

Смежные вопросы