【问题标题】:Possible to modify an enum in a third-party ActiveX control?可以修改第三方 ActiveX 控件中的枚举吗?
【发布时间】:2013-11-30 04:58:16
【问题描述】:

我正在使用来自供应商的 ActiveX 控件,用于读取 RFID 卡的 USB 设备。

我的应用程序是用 java 编写的,所以我使用 EZJCom 作为“桥梁” - 因此,activeX 控件的所有属性和方法都可以通过 java 类使用。

如果我在 Windows 设备管理器中查看,读卡器设备位于 com 端口 COM8

现在,问题是因为这个枚举,它指示设备正在运行的 COM 端口。

typedef enum {
    COM1 = 1,
    COM2 = 2,
    COM3 = 3,
    COM4 = 4
} CommPortConstants;

我的 Java 代码可以做到这一点:

cardReader.get_DMF5Ax().setCommPort(CommPortConstants.COM4);  // OK

但不是这个:

cardReader.get_DMF5Ax().setCommPort(CommPortConstants.COM8);  // fails!

换句话说,由于这个枚举的性质,我无法在 COM8 上查找设备(通过 java 调用 ActiveX 控件)。

所以对于我的问题:有没有办法“编辑”一个 ActiveX 控件,并向枚举添加值?

或者有没有更好的方法(除了 EZJCom)来使用 java 中的 activeX 控件。

请注意,我没有 ActiveX 控件的源代码,而且(来自 java 世界)我也不熟悉制作它们的开发环境。

【问题讨论】:

    标签: java com enums activex


    【解决方案1】:

    我对 EZJCom 一无所知(对 Java 也知之甚少),但从 ActiveX/COM 来看,我认为您在处理它时应该没有问题。

    COM 方法(特别是自动化方法)不获取 Java 枚举。在大多数情况下,它们要么得到 LONG,在某些情况下,它们会得到 VARIANT 或类型 I4。

    看起来 CommPortConstants 只是常量,所以这应该适合你:

    cardReader.get_DMF5Ax.setCommPort(8)
    

    【讨论】:

    • 嗨,Uri,感谢您的回答,但是 EZJCom 程序已经为 activeX 控件创建了一个接口,不幸的是它只接受枚举。我寻找一种接受int 的方法,但没有找到。
    • 我试过这个cardReader.get_DMF5Ax().JComSetProperty("CommPort", new JComVariant[] {new JComVariant(8)}) 但它给了我例外:ezjcom.JComException: Parameter not optional. (0x8002000f)... :(
    • 在不了解 EZJCon 的情况下,我推测如果 EZJCon 公开 IDispatch 功能,也许您可​​以使用较低级别的 API:GetIDsOfNames 和 Invoke?
    • 然后,在一个完全不同的层面上,如果您可以在 COM1 到 COM4 中找到可用端口,也许您可​​以将 Win32 名称(也称为 DosDevices 名称)“COM4”映射到实际的设备 COM8。看看:msdn.microsoft.com/en-us/library/windows/hardware/…
    • 我看不到任何 IDispatch 功能,但我发现了一个通用方法 cardReader.JComSetProperty("CommPort", new JComVariant[] {new JComVariant(8)}) 失败并出现异常:ezjcom.JComException: Parameter not optional. (0x8002000f)
    猜你喜欢
    • 1970-01-01
    • 2014-02-13
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多