우리는 Windows 7 Enterprise, SP1, 64bit에서 실행됩니다. 방금 Java 7을 모든 컴퓨터에 설치했는데 다음과 같은 문제가 발생했습니다.Java 7 : COM-API가 Quality Center (OTAClient.dll)에서 작동하지 않지만 Java 6에서 작동합니다.
내 프로그램이 Quality Center의 OpenTestArchitecture-API와 통신을 시도 할 때 ActiveX 구성 요소를 만들지 못합니다. 내 Java-COM 라이브러리로 JACOB을 사용합니다. 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-메시지는 "객체를 생성 - 공동 수 없습니다"하지만 난 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 테스트를 가지고,하지만 난 이미 충분한 코드를 게시했기 때문에 나는 그것을 게시되지 않은)
편집 : 같은 테스트를 윈도우 XP SP3 및 Java 7
원래 jacob 코드에서 가져 오는 예외가 "메모리 액세스 위반"인지 HRESULT인지 여부는 명확하지 않습니다. –
그리고 com4j 및 java 7을 사용하여 동일한 동작이 재생되는지 여부를 명확히 할 수 있다면 –
원래 Jacob-Exception은 "개체를 공동으로 만들 수 없습니다"입니다. 이것이 Native-Part에서 CoCreateInstance 함수의 결과가 무엇인지 알아 내려고 노력한 것을 알지 못하기 때문에 말입니다. 이 메소드의 오류 메시지는 "메모리 위치에 유효하지 않은 액세스"입니다. Jacob 대신 com4j를 사용할 때 "Excel.Application"및 "TDApiOle80.TDConnection"은 Java 6에서 작동하지만 Java 7 "Excel.Application"은 작동하지만 "TDApiOle80.TDConnection"은 작동하지 않습니다. – r3zn1k