2012-05-11 3 views
8

우리는 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

+1

원래 jacob 코드에서 가져 오는 예외가 "메모리 액세스 위반"인지 HRESULT인지 여부는 명확하지 않습니다. –

+0

그리고 com4j 및 java 7을 사용하여 동일한 동작이 재생되는지 여부를 명확히 할 수 있다면 –

+0

원래 Jacob-Exception은 "개체를 공동으로 만들 수 없습니다"입니다. 이것이 Native-Part에서 CoCreateInstance 함수의 결과가 무엇인지 알아 내려고 노력한 것을 알지 못하기 때문에 말입니다. 이 메소드의 오류 메시지는 "메모리 위치에 유효하지 않은 액세스"입니다. Jacob 대신 com4j를 사용할 때 "Excel.Application"및 "TDApiOle80.TDConnection"은 Java 6에서 작동하지만 Java 7 "Excel.Application"은 작동하지만 "TDApiOle80.TDConnection"은 작동하지 않습니다. – r3zn1k

답변

2

야곱과 함께 작동 DLL은 JRE의 jvm.dll (메소드 및 구조)과 연결됩니다. 그래서 제 생각에는 Jacob DLL을 Java 7 소스에서 컴파일하여 Java 7 JRE에 제대로로드해야합니다.

당신은 not alone하지만 제 생각 엔 너무 적은 사람들이 이미 자바 7 ...

실행하는

업데이트 : 내가 거기에 몇 가지 라이브러리 또는 시스템이 자바 프로세스에 실패 호출 경우 Process Monitor 먼저 조사 제안 디버거에서 프로세스 자체를 실행하기 전에 ... OpenJDK 7도 시도해 볼 수있는 옵션 일 수 있습니다. 적어도 문제가 무엇인지 진단하기 위해서는 디버깅이 더 쉬워야합니다.

+0

자바 7을 사용하여 jacob을 이미 만들었지 만 변경되지 않았습니다 ... 어쨌든 귀하의 답변에 감사드립니다! – r3zn1k