2012-05-11 17 views
8

Chúng tôi đang chạy trên Windows 7 Enterprise, SP1, 64bit. Chúng tôi chỉ cài đặt Java 7 trên tất cả các máy của chúng tôi, gây ra sự cố sau:Java 7: COM-API không hoạt động với Trung tâm chất lượng (OTAClient.dll), nhưng hoạt động với Java 6

Khi chương trình của tôi cố gắng liên lạc với OpenTestArchitecture-API từ Trung tâm chất lượng, nó không thể tạo thành phần ActiveX. Tôi sử dụng JACOB làm thư viện Java-COM của mình. Nâng cấp lên phiên bản mới nhất của JACOB không thay đổi bất cứ điều gì.

Các thử nghiệm sau đây làm việc với jdk1.6.0_24 (32 bit) nhưng không thành công với 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(); 
     } 
    } 
} 

đầu ra 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 output:

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) 

Thông báo ComFailException-Message ban đầu là "Không thể tạo đối tượng" nhưng tôi đã chỉnh sửa Mã sau đây trong j acob Dispatch.cpp: (Tôi không chạm CoCreateInstance, tôi chỉ muốn biết những gì HRESULT là)

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

Có ai có một đầu mối những gì các vấn đề có thể được? Sự khác biệt duy nhất là tôi chuyển đổi giữa thời gian chạy Java 6 và Java 7.

Cảm ơn rất nhiều sự giúp đỡ của bạn!

PS: Excel hoạt động với cả hai phiên bản và chuyển đổi sang com4j-Library không thay đổi bất cứ điều gì. (Tôi có một com4j-Test, nhưng tôi đã không gửi nó bởi vì tôi đã đăng tải đủ code)

Edit: Các thử nghiệm cùng làm việc với Windows XP, SP3 và Java 7.

+1

Không rõ liệu ngoại lệ bạn nhận được từ mã Jacob ban đầu là "vi phạm truy cập bộ nhớ" hay HRESULT? –

+0

Và nếu bạn có thể làm rõ liệu cùng một hành vi tái tạo bằng cách sử dụng com4j và java 7. –

+0

Jacob-Exception gốc là "Không thể đồng tạo đối tượng". Bởi vì điều này không nói nhiều lắm nên tôi đã cố gắng tìm ra kết quả của hàm CoCreateInstance trong Native-Part là gì. Thông báo lỗi từ phương pháp này là "Truy cập không hợp lệ vào vị trí bộ nhớ". Khi tôi sử dụng com4j thay vì Jacob tôi nhận được kết quả tương tự: "Excel.Application" và "TDApiOle80.TDConnection" hoạt động với Java 6, với Java 7 "Excel.Application" hoạt động nhưng "TDApiOle80.TDConnection" thì không. – r3zn1k

Trả lời

2

Jacob DLL được liên kết với jvm.dll (phương pháp và cấu trúc) từ JRE. Vì vậy, tôi đoán là Jacob DLL nên được biên dịch từ các nguồn với Java 7 để tải đúng vào Java 7 JRE.

Bạn đang not alone nhưng tôi đoán quá ít người đã chạy Java 7 ...

Cập nhật: Tôi đề nghị bạn điều tra đầu tiên với Process Monitor nếu có một số thư viện hay hệ thống các cuộc gọi thất bại trong quá trình Java của bạn, trước khi chạy quá trình đó trong trình gỡ lỗi ... Có lẽ OpenJDK 7 có thể là một tùy chọn để thử quá, nên dễ debug hơn, ít nhất là để chẩn đoán vấn đề là gì.

+0

Tôi đã xây dựng jacob với java 7, nhưng điều đó không thay đổi bất cứ điều gì ... Dù sao, cảm ơn câu trả lời của bạn! – r3zn1k