Java 7 : COM-API does not work with Quality Center (OTAClient. dll),但适用于 Java 6

标签 java com java-7 jacob hp-quality-center

我们在 Windows 7 企业版 SP1 64 位上运行。 我们刚刚在所有机器上安装了 Java 7,这导致了以下问题:

当我的程序尝试与 Quality Center 的 OpenTestArchitecture-API 通信时,它无法创建 ActiveX-Component。我用 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-Message 是“无法共同创建对象”,但我在 jacob 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-Test,但是我没有发布它,因为我已经发布了足够多的代码)

编辑:同样的测试适用于 Windows XP、SP3 和 Java 7。

最佳答案

Jacob DLL 与来自 JRE 的 jvm.dll(方法和结构)链接。所以我的猜测是,Jacob DLL 应该使用 Java 7 从源代码编译,以便正确加载到 Java 7 JRE 中。

你是not alone但我想已经运行 Java 7 的人太少了......

更新:我建议你先调查一下 Process Monitor如果您的 Java 进程中有一些库或系统调用失败,那么在调试器中运行进程本身之前......也许 OpenJDK 7 也可能是一个尝试的选项,那么它应该更容易调试,至少可以诊断出是什么问题是。

关于Java 7 : COM-API does not work with Quality Center (OTAClient. dll),但适用于 Java 6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10547969/

相关文章:

java - 只有 Jetty 9 NIO 吗?

java - 声明扩展 2 个不同接口(interface)的类型属性

c++ - 客户端不会与 ATL 服务对话

python win32com 导致程序崩溃

unicode - Java 8 处理与 Java 7 不同的无效 UTF-8 编码....?

java - EJB 计时器是否应该持久/可靠?

java - 将 ListView 项解析为 setBackgroundResource 时发生 NullPointerException

c# - Visual Basic COM DLL 在版本升级时不加载 COM .NET 程序集

java - Java JRE (7, 8) 的 Windows tar.gz 文件是什么?

java - 如何在运行 java 时修复 "Failed to write core dump. Core dumps have been disabled"错误