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.
Non è chiaro se l'eccezione che si ottiene dal codice jacob originale sia una "violazione di accesso alla memoria" o un HRESULT? –
E se è possibile chiarire se lo stesso comportamento si riproduce utilizzando com4j e java 7. –
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