2012-05-11 56 views
8

我們運行在Windows 7 Enterprise SP1,64位上。 我們剛剛在我們所有的機器上安裝了Java 7,這會導致以下問題:Java 7:COM-API不能與Quality Center(OTAClient.dll)一起使用,但適用於Java 6

當我的程序嘗試與Quality Center中的OpenTestArchitecture-API通信時,它無法創建ActiveX組件。我使用JACOB作爲我的Java-COM庫。升級到最新版本的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試驗,但我沒有將它張貼因爲我已經張貼足夠的代碼)

編輯:同樣的測試適用於Windows XP,SP3和Java 7

+1

目前還不清楚您從原始jacob代碼獲取的異常是「內存訪問衝突」還是HRESULT? –

+0

如果您可以澄清是否使用com4j和java 7重現了相同的行爲。 –

+0

原始的Jacob-Exception是「無法共同創建對象」。因爲這並不能說明我試圖弄清楚Native-Part中的CoCreateInstance函數的結果是什麼。此方法的錯誤消息是「對存儲器位置的訪問無效」。當我使用com4j而不是Jacob時,我得到了相同的結果:「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但我猜的人太少了已經在運行的Java 7 ...

更新:我建議你Process Monitor首先調查是否有一些庫或系統在Java進程調用失敗,在調試器中運行進程本身之前......也許OpenJDK 7也可能是一個可以嘗試的選項,那麼調試應該會更容易,至少可以診斷出問題所在。

+0

我已經用java 7創建了jacob,但是這並沒有改變任何東西......無論如何,謝謝你的回答! – r3zn1k

相關問題