8

Windows 7 Enterprise、SP1、64ビットで実行しています。すべてのマシンにJava7をインストールしたところ、次の問題が発生します。

プログラムがQualityCenterからOpenTestArchitecture-APIと通信しようとすると、ActiveX-Componentの作成に失敗します。私は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-メッセージは「オブジェクトを共同作成できません」ですが、jacobDispatch.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;
  }

誰かが問題が何であるかについての手がかりを持っていますか?唯一の違いは、Java6ランタイムとJava7ランタイムを切り替えることです。

よろしくお願いします!

PS:Excelは両方のバージョンで動作し、com4j-Libraryへの切り替えは何も変更しません。(私はcom4j-Testを持っていますが、すでに十分なコードを投稿しているため、投稿しませんでした)

編集:同じテストがWindows XP、SP3、およびJava7で機能します。

4

1 に答える 1

2

Jacob DLL はjvm.dll、JRE から (メソッドと構造体) にリンクされています。したがって、Java 7 JRE に適切にロードするには、Jacob DLL を Java 7 のソースからコンパイルする必要があると思います。

あなたは一人ではありませんが、すでに Java 7 を実行している人はほとんどいないと思います...

更新:デバッガーでプロセス自体を実行する前に、Java プロセスで失敗したライブラリまたはシステム コールがある場合は、最初にProcess Monitorで調査することをお勧めします...おそらく OpenJDK 7 も試すオプションになる可能性があります。次に、少なくとも問題の原因を診断するためにデバッグします。

于 2012-05-15T10:18:27.657 に答える