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.
Nie jest jasne, czy wyjątek otrzymywany z oryginalnego kodu jacoba to "naruszenie dostępu do pamięci" lub HRESULT? –
A jeśli możesz wyjaśnić, czy to samo zachowanie powiela się przy użyciu com4j i java 7. –
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