繁体   English   中英

JNA 中的 Application.advise() ComException

[英]Application.advise() ComException in JNA

我在Java中处理Excel。我们正在使用JNA的COM API访问Excel应用程序数据。我想在Excel应用程序关闭时连接。 所以,我使用的是基于 JNA 的库。

your text com.sun.jna.platform.win32.COM.util.Factory your text eu.doppel_helix.jna.tlb.excel1.AppEventsListenerHandler your text eu.doppel_helix.jna.tlb.excel1.Application...

但是,当在 Application.advise() 中注册事件处理程序时,它会被阻塞,因此如果您使用线程进行,则会出现如下所示的错误。

线程“Thread-1”中的异常 com.sun.jna.platform.win32.COM.COMException:建议:接口必须通过位于at com.sun.jna.platform.win32.COM.util.ProxyObject.advise(ProxyObject.java:287) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)的 ComInterface 注释为任一 iid 定义一个值at com.sun.jna.platform.win32.COM.util.ProxyObject.advise(ProxyObject.java:287) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ...

我应该怎么做才能防止上述异常发生? 从根本上说,我如何捕获我运行的 Excel 应用程序关闭的事件? 请帮我。 我没有Windows COM操作方法和API知识。

谢谢你。

我在下面做了:

Factory factory = new Factory( myComThread ); Application excelApp= factory.createObject(Application.class); excelApp.advise(Application.class, new MyAppEventListenerHandler()); //no response. blocking

我预计当 Excep 应用程序关闭时我可以捕获该事件。

您可以处理在任何打开的工作簿关闭之前立即触发的Application.WorkbookBeforeClose事件。 如果打开了一个工作簿,则 Excel 应用程序实例可以用它关闭。

请注意,Microsoft 目前不建议也不支持来自任何无人值守、非交互式客户端应用程序或组件(包括 ASP、ASP.NET、DCOM 和 NT 服务)的 Microsoft Office 应用程序自动化,因为 Office 可能表现出不稳定的行为和/ 或在此环境中运行 Office 时出现死锁。

如果您正在构建一个在服务器端上下文中运行的解决方案,您应该尝试使用已被安全用于无人值守执行的组件。 或者,您应该尝试找到至少允许部分代码在客户端运行的替代方案。 如果您使用来自服务器端解决方案的 Office 应用程序,该应用程序将缺少许多成功运行所必需的功能。 此外,您将承担整体解决方案稳定性的风险。 服务器端自动化 Office 文章的注意事项中阅读更多相关信息。

如果您只处理打开的 XML 文档,您可以考虑使用 Open XML SDK 而不是自动化 Excel。有关更多信息,请参阅 欢迎使用 Open XML SDK 2.5 for Office

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM