2012-05-11 18 views
8

Siamo in esecuzione su Windows 7 Enterprise, SP1, 64 bit. Abbiamo appena installato Java 7 su tutte le nostre macchine, che causa il seguente problema:Java 7: COM-API non funziona con Quality Center (OTAClient.dll), ma funziona con Java 6

Quando il mio programma tenta di comunicare con l'API OpenTestArchitecture dal Quality Center, non riesce a creare ActiveX-Component. Io uso JACOB come libreria Java-COM. L'aggiornamento all'ultima versione di JACOB non cambia nulla.

Il seguente test funziona con jdk1.6.0_24 (32 bit), ma non con 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(); 
     } 
    } 
} 

uscita 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 uscita:

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) 

l'originale ComFailException-messaggio è "non riesco a co-creare l'oggetto", ma ho modificato il seguente codice nella j ACOB Dispatch.cpp: (non ho toccato CoCreateInstance, volevo solo sapere qual è la HRESULT era)

// 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; 
    } 

Qualcuno ha idea di cosa il problema potrebbe essere? L'unica differenza è che passo tra Java 6 e Java 7 runtime.

Grazie mille per il vostro aiuto!

PS: Excel funziona con entrambe le versioni e un passaggio su com4j-Library non modifica nulla. (Ho un com4j-Test, ma non ho posto perché ho già postato abbastanza codice)

Edit: Lo stesso test funziona con Windows XP, SP3 e Java 7.

+1

Non è chiaro se l'eccezione che si ottiene dal codice jacob originale sia una "violazione di accesso alla memoria" o un HRESULT? –

+0

E se è possibile chiarire se lo stesso comportamento si riproduce utilizzando com4j e java 7. –

+0

L'originale Jacob-Exception è "Can not co-create object". Poiché ciò non dice molto, ho cercato di capire quale fosse il risultato della funzione CoCreateInstance nella parte nativa. Il messaggio di errore di questo metodo è "Accesso non valido alla posizione di memoria". Quando uso com4j anziché Jacob ottengo gli stessi risultati: "Excel.Application" e "TDApiOle80.TDConnection" funzionano con Java 6, con Java 7 "Excel.Application" funziona ma "TDApiOle80.TDConnection" no. – r3zn1k

risposta

2

Jacob La DLL è collegata con jvm.dll (metodi e strutture) da JRE. Quindi la mia ipotesi è che la DLL di Jacob dovrebbe essere compilata da sorgenti con Java 7 da caricare correttamente in Java 7 JRE.

Sei not alone ma immagino troppo poche persone sono già in esecuzione Java 7 ...

Aggiornamento: vi propongo di indagare prima con Process Monitor se ci sono qualche libreria o chiamate di sistema in mancanza nel vostro processo di Java, prima di eseguire il processo stesso in un debugger ... Forse OpenJDK 7 potrebbe essere un'opzione da provare, dovrebbe essere più facile eseguire il debug quindi, almeno per diagnosticare quale sia il problema.

+0

Ho già costruito jacob con java 7, ma questo non ha cambiato nulla ... Comunque, grazie per la tua risposta! – r3zn1k