我們運行在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
目前還不清楚您從原始jacob代碼獲取的異常是「內存訪問衝突」還是HRESULT? –
如果您可以澄清是否使用com4j和java 7重現了相同的行爲。 –
原始的Jacob-Exception是「無法共同創建對象」。因爲這並不能說明我試圖弄清楚Native-Part中的CoCreateInstance函數的結果是什麼。此方法的錯誤消息是「對存儲器位置的訪問無效」。當我使用com4j而不是Jacob時,我得到了相同的結果:「Excel.Application」和「TDApiOle80.TDConnection」適用於Java 6,Java 7「Excel.Application」適用,但「TDApiOle80.TDConnection」不適用。 – r3zn1k