2012-05-11 17 views
8

Pracujemy na Windows 7 Enterprise, SP1, 64bit. Właśnie zainstalowaliśmy Javę 7 na wszystkich naszych komputerach, co powoduje następujący problem:Java 7: COM-API nie działa z Quality Center (OTAClient.dll), ale działa z Javą 6

Kiedy mój program próbuje komunikować się z OpenTestArchitecture-API z Quality Center, nie może utworzyć komponentu ActiveX. Używam JACOB jako mojej biblioteki Java-COM. Aktualizacja do najnowszej wersji JACOB niczego nie zmienia.

Poniższe testy współpracuje z jdk1.6.0_24 (32 bit), ale nie z jdk1.7.0_04 (32 bit):

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(); 
     } 
    } 
} 

wyjście 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 wyjściowa:

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) 

Oryginalny ComFailException-Message „nie może współtworzyć obiekt” ale ja edytowany następujący kod w j acob Dispatch.cpp: (nie dotykać CoCreateInstance, chciałem tylko wiedzieć, jaka była 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; 
    } 

Czy ktoś ma pojęcia, na czym polega problem może być? Jedyną różnicą jest to, że przełączam się między środowiskiem wykonawczym Java 6 i Java 7.

Dziękuję bardzo za pomoc!

PS: Excel działa w obu wersjach, a przełącznik na com4j-Library niczego nie zmienia. (Mam com4j-Test, ale nie po to, bo już wystarczająco dużo pisał kod)

Edit: Ten sam test działa z Windows XP SP3 i Java 7.

+1

Nie jest jasne, czy wyjątek otrzymywany z oryginalnego kodu jacoba to "naruszenie dostępu do pamięci" lub HRESULT? –

+0

A jeśli możesz wyjaśnić, czy to samo zachowanie powiela się przy użyciu com4j i java 7. –

+0

Oryginalny wyjątek Jacoba to "Nie można współtworzyć obiektu". Ponieważ to niewiele mówi, próbowałem dowiedzieć się, jaki był wynik funkcji CoCreateInstance w Native-Part. Komunikat o błędzie z tej metody to "Nieprawidłowy dostęp do lokalizacji pamięci". Kiedy używam com4j zamiast Jacoba, uzyskuję takie same wyniki: "Excel.Application" i "TDApiOle80.TDConnection" współpracują z Javą 6, z Java 7 "Excel.Application" działa, ale "TDApiOle80.TDConnection" nie działa. – r3zn1k

Odpowiedz

2

Jacob DLL jest połączony z jvm.dll (metody i struktury) z JRE. Zgaduję więc, że biblioteka DLL Jacob powinna zostać skompilowana ze źródeł z Javą 7, aby poprawnie załadować do środowiska Java 7 JRE.

Jesteś not alone ale myślę, że zbyt mało osób już działa Java 7 ...

Aktualizacja: proponuję zbadać najpierw Process Monitor jeśli istnieją pewne biblioteki lub wywołań systemowych braku w procesie Java, przed uruchomieniem samego procesu w debugerze ... Może OpenJDK 7 może być opcją do wypróbowania, powinno być łatwiejsze debugowanie, przynajmniej w celu zdiagnozowania problemu.

+0

Mam już zbudowany Jacob z Java 7, ale to nic nie zmieniło ... W każdym razie, dziękuję za odpowiedź! – r3zn1k

Powiązane problemy