gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:56:12 24 4
gpt4 key购买 nike

我们在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com