有时只会发生此错误,因此我的环境基本上应该是正确的:
在32位JRE中运行的Java Applet。当前是1.8_172,但是每个版本的testet都可能发生错误。这包括不同版本的Java 1.6和1.7。
兑换32bit dll已正确注册
使用Outlook 32位(错误发生在不同的Outlook版本和修订版上)
jacob.dll是32位并且在路径中
有问题的代码如下所示:
ActiveXComponent m_oOutlook = ActiveXComponent.connectToActiveInstance( "Outlook.Application" );
Dispatch m_mail = Dispatch.invoke( m_oOutlook.getObject(), "CreateItem", Dispatch.Get, new Object[] { "0" }, new int[0] ).toDispatch();
ActiveXComponent m_safeMailItem = new ActiveXComponent( "Redemption.SafeMailItem" ); // <-- exception happens here
在大多数情况下,使用此代码的应用程序根本不会通过此程序发送电子邮件。但这有时会引发以下异常:
com.jacob.com.ComFailException: Can't co-create object
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)
在同一会话中成功发送了几封电子邮件后,可能会发生这种情况。
因为这个问题根本无法重现,所以我没有主意。它有时会发生。
我们当前的解决方法:重新启动我们的应用程序,如果这也不能帮助重新启动Outlook。
在德米特里·斯特雷布连科的回答后由我编辑:
我可以访问和更改的Java代码作为Java Bean加载到主应用程序(封闭源“ Oracle Forms” Java Applet)中。
我进行了一些测试,并且Bean的静态成员似乎在已加载的Applet的整个生命周期中都可以生存(当然是在首次实例化Bean之后)。
现在,我在Bean的构造函数中创建一个类型为“ Redemption.RDOSession”的ActiveXComponent的实例,并将其保存在静态成员变量中(如果尚未设置)。
public OutlookBean()
{
if( m_RDOSession == null )
{
m_RDOSession = new ActiveXComponent( "Redemption.RDOSession" );
System.out.println( "RDOSession created" );
}
};
private static ActiveXComponent m_RDOSession = null;
这样够了吗?对象的存在是否足够,还是我需要在该对象上调用任何成员函数?您在http://www.dimastr.com/redemption/faq.htm#Threads处的FAQ看起来就像创建对象就足够了:
每个可创建的赎回对象(例如RDOSession)在创建时都会通过调用MAPIInitialize来初始化MAPI。
在我的计算机上,它可以正常运行,没有任何负面影响,但是由于我无法重现该错误,因此无法检查是否可以解决此问题。
让我的用户测试它是一项艰巨的任务,我希望至少有一半的信心可以对他们有所帮助,并且不会带来任何新问题。 🙄
提前谢谢了。
最佳答案
如果您多次创建和销毁可创建的Redemption对象,则实际上是在循环MAPI系统,但事实并非如此。
经验法则是创建一个全局赎回(您无需对其进行任何操作,只需使其保持活动状态即可)-这样,MAPI系统将被加载并保持加载状态。
见http://www.dimastr.com/redemption/faq.htm#Threads
关于java - 为什么在与Redemption一起使用时,jacobs“new ActiveXComponent”有时会抛出“无法共同创建对象”?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60001859/