2012-05-11 12 views
8

Windows 7 Enterprise、SP1、64bitで動作しています。 私たちはすべてのマシンに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関数の結果が何であるかを調べようとしました。このメソッドからのエラー・メッセージは、「メモリー・ロケーションへの無効なアクセス」です。 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ですが、私はあまりにも少数の人々がすでに...

更新のJava 7を実行していると思います:いくつかのライブラリやシステムがある場合、私はあなたがProcess Monitorで最初の調査を提案は、あなたのJavaプロセスに失敗呼び出しますデバッガでプロセス自体を実行する前に...おそらくOpenJDK 7も試してみることができるかもしれませんし、少なくとも問題が何かを診断するためには、デバッグするのが簡単なはずです。

+0

私はすでにJava 7でjacobを構築しましたが、それは何も変わっていません...とにかく、あなたの答えをありがとう! – r3zn1k