【问题标题】:Oleacc dll support in JNAJNA 中的 Oleacc dll 支持
【发布时间】:2020-05-27 15:52:41
【问题描述】:

我正在尝试使用 JNA 库为我正在处理的 Java 项目调用 Oleacc dll 的 AccessibleObjectFromWindow 方法。

我浏览了 JNA 文档并在线搜索了一个示例,但找不到在 JNA 的 Oleacc dll 中使用 AccessibleObjectFromWindow 的良好参考。

能否请对JNA库有良好背景的人确认JNA是否包含Oleacc dll的功能?

如果没有从 Java 程序中使用 Oleacc dll 的任何替代方法,我们也非常感谢。

谢谢..!

【问题讨论】:

标签: java winapi java-native-interface jna


【解决方案1】:

当您提出“JNA 包括”问题时,指出 JNA 项目有两个部分会很有帮助。 jna artifact 包含核心功能,jna-platform artifact 包含 user-submitted 各种平台的 JNA 映射。我强调“用户提交”,因为 JNA 是一个社区维护的项目,“JNA 在其平台库映射中缺少函数 XXX”的常见问题解答是 "No, it's not, it's just waiting for you to add it :)"

Oleacc dll 就是这些实例之一。它还没有出现在jna-platform 工件中,但如果用户提交了它可能会出现。例如,请参阅 user in 2015 自己映射了这个库,但没有将它贡献给社区,所以 5 年后你在这里重现了这一努力!如果您在该 JNA 问题中向下滚动,您会看到一些示例代码实现了您的方法以及其他一些方法,如果您能为 JNA 做出贡献,那就太好了!

同时,当映射不在 JNA 中时,上面的常见问题解答链接提供了如何实现它的模板。在您的特定情况下,实现AccessibleObjectFromWindow 的代码对您来说很简单,您可以在自己的项目中执行此操作。使用以下内容创建一个 Oleacc 类:

public interface Oleacc extends StdCallLibrary, WinUser, WinNT {

    Oleacc INSTANCE = (Oleacc) Native.loadLibrary("oleacc", Oleacc.class, W32APIOptions.DEFAULT_OPTIONS);

    HRESULT AccessibleObjectFromWindow(HWND win, int objID, Guid.REFIID iid, PointerByReference ptr);
}

你就完成了!那么 JNA 中的映射还存在吗?不,但希望在您实现它并测试您的代码之后,您可以将您的映射贡献给项目,以便下一个需要这样做的人可以在 JNA 中找到它!

【讨论】:

  • 感谢您的意见。使用您的输入和链接的 Github 问题的示例代码,我能够从我的 Java 代码中调用 AccessibleObjectFromWindow() 方法。从 IAccessible 接口方法中,我只需要一些方法来实现我的功能,例如我设法在我的代码中实现的 get_accChildCount、get_accName 和 get_accValue。但是,为了对 JNA 做出全面贡献,需要实现 IAccessible 中的所有方法,而我目前没有时间。也许将来如果我有时间我会完成并做出贡献。再次感谢。
  • 您不需要映射所有方法,只需映射您使用的方法。如果需要,其他人也可以添加单独的功能。我贡献了WbemCli 类,并且只映射了使我的WMI 代码正常工作所需的几个函数。请注意,如果您 extend 一个现有的 COM 类,如 UnknownDispatch,您将免费获得前 3 或 7 个方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多