几个星期以来,我们一直在努力解决一个问题,即少数客户的Outlook插件因未确定的原因而被卸载和禁用."禁用"是指Outlook将以下注册表值从3更改为2,这实际上意味着下次启动时不会加载该插件:
HKEY_LOCAL_MACHINE\Software\Microsoft\Office\Outlook\Addins\[OurAddin.sProgID]\LoadBehavior
没有错误消息,也没有任何异常显示在我们的addin生成自己的日志文件中.
我已经找到以下专门处理LoadBehavior更改问题的页面:http://blogs.msdn.com/vsod/archive/2008/04/22/Troubleshooting-com-add-in-load-failures.aspx
但是,那里提出的任何可能的理由似乎都不适用:
插件不仅列在"禁用项目"列表中.
在IDTExtensibility2
方法中和代码中的任何其他地方都没有未处理的异常.所有代码都包含在try/catch等效项中,并且所有异常输出仅通过OutputDebugString
日志文件发送或发送到日志文件中.
该错误似乎与防病毒软件无关,即它也会在禁用时发生.
禁用所有其他插件也不会对错误产生影响.
那么,还有什么可以导致Outlook禁用插件?
更多细节/观察:
到目前为止,我们无法在测试环境中重现该问题,因此在问题发生时我们尚未能附加调试器.
当我们尝试通过远程支持(TeamViewer)观察会发生什么时,问题永远不会发生.我怀疑这是因为TeamViewer使用了一个钩子DLL,它将自身注入到所有正在运行的进程(包括Outlook)中,从而影响内存布局,时序,线程顺序等等.
每当我们编译新版本的插件以尝试新的东西时,插件通常可以正常工作几个小时甚至几天,最终再次被禁用.一旦发生这种情况,所有后续尝试在该机器上加载插件(通过手动更改LoadBehavior值)将失败(即LoadBehaviour将简单地改回2),直到我们编译和部署另一个版本(或尝试使用TeamViewer - 见上文).
通常,插件将在Outlook启动时立即卸载,但偶尔也会在Outlook运行一段时间后发生.在这些情况下,日志文件看起来完全不可靠 - 插件只是经历了常规关机步骤,就像Outlook正常关闭一样.
据我所知,从我们的日志文件和通过SysInternals ProcessMonitor观察问题,当在Outlook启动时(而不是在会话期间)禁用插件时,即使在COM对象(即插件)实例化之前,DLL也会被卸载(构造函数中的日志消息永远不会显示).
我们已将OutputDebugString
消息放入initialization
部分(这是一个Delphi DLL).当插件无法加载时,它们都不会出现.
只有极少数客户受此问题影响.我们有数万个安装,我们没有收到任何关于此的报告.
更新:似乎经常(但不总是)在addin被卸载之前记录的最后一件事是文本"OLE错误800A01A8"的异常.该异常被我正在使用的框架(Add-in-Express)中内置的全局异常处理程序捕获,并且看起来并不是源自我自己的代码,而现在每个方法完全包含在其中try..catch
.这通常发生在我从Inspector的Activate事件处理程序设置我的CommandBarButtons的可见性之后.
所有受影响机器的共同属性:
Windows XP Professional,最新的补丁级别
Outlook 2003 Professional,最新的修补程序级别
不同版本的McAfee Virus Scan(虽然禁用它没有效果 - 见上文)
用户是本地Administrators组的成员
还有一点需要注意的是,这可能也很重要(尽管可能没有我想象的那么多):
我们正在使用来自第三方供应商的许可/复制保护模块,该模块将已编译的DLL包装在"shell"中,并且仅在运行时解包.自从我发现即使在我们自己的代码被执行之前,addin被卸载,这一直是我的主要嫌疑人.但是,虽然供应商确认其代码中可能存在未处理的异常,但是由保护shell的特殊调试版本生成的日志文件显示解包过程已成功完成,并且在Outlook卸载插件之前控件已经传回受保护的DLL .因此,无论是什么导致Outlook卸载我们的插件都发生在保护shell初始化完成和我们自己的代码之间.
还有什么想法吗?
我的公司已经忍受了多年来你所看到的同样问题.我们的插件是用于Outlook 2003的VB6 COM插件,它部署在数百台机器上,每天可以循环数百次(如果不是数千次).我们经历了很多装载和卸载循环.
我们得到了一些插件加载但没有连接的一般错误,我们在代码中处理它.(显然不是生产质量)
Dim outlook As outlook.Application Set outlook = CreateObject("Outlook.Application") outlook.COMAddIns("MyFancyDancyPlugin").Connect = True
很少,但并不罕见,这不是一个烦恼,我们看到插件达到一个加载的状态,我们可以在"工具>选项>其他>高级选项> Com加载项"中看到它,但我们只是无法连接到这个东西.如果您尝试连接,则不会出现错误,只会切换回断开连接.[相当于在注册表项中切换回2]就我所知,COM对象永远不会被创建.该项目未列在"已禁用"项中.
我们实际上不必重新部署来纠正此错误.通过Com加载项对话框删除对象,然后重新添加它似乎可以解决问题.这仍然不是一个可接受的解决方案,但它确实可以在不重新安装的情况下恢复运行.
Windows XP Professional,最新的补丁级别
Outlook 2003 Professional,最新的修补程序级别
不同版本的McAfee Virus Scan(虽然禁用它没有效果 - 见上文)
用户是本地Administrators组的成员
这似乎很合适,我们不使用McAfee,但病毒扫描程序也不与outlook或com加载项交互.我们也不使用复制保护应用程序.
对不起,我无法提供更多的帮助,但我很想知道这一点.