我正在构建一个在Outlook中打开现有邮件的应用程序。用户可能已经或可能没有运行Outlook。如果Outlook没有运行,一切正常,但如果它已经运行,我会收到COM错误(80080005)。互联网似乎表明,如果现有的Outlook进程运行的权限级别高于尝试绑定到它的应用程序,则会发生这种情况。
我还有其他方式要求Outlook打开邮件,还是只需要确保我匹配权限级别?
谢谢,
-Patrick
编辑在原始问题中添加代码,因为Stack Overflow不允许在评论中进行有意义的格式化。
我原本做以下事情:
var outlook = new Outlook.Application();
该行适用于所有情况,除了我在启动应用程序之前启动Outlook的情况。在这种情况下,我得到上述80080005错误代码。
我已将此更改为更明确的COM:
Application outlook;
try
{
outlook = (Application)Marshal.GetActiveObject("Outlook.Application");
}
catch (COMException ex)
{
if (ex.ErrorCode == -2147221021)
outlook = new ApplicationClass();
else
throw;
}
但是,该代码仍然不能正常工作 - 如果Outlook正在运行,我会捕获一个异常,其ErrorCode为0x800401E3(MK_E_UNAVAILABLE)。但是当我尝试创建新的ApplicationClass对象时,我仍然得到相同的80080005错误代码。
我也尝试将以下内容放入catch块而不是new ApplicationClass()
行,但行为没有区别:
outlook = (Application) Activator.CreateInstance(
Type.GetTypeFromProgID("Outlook.Application"));
答案 0 :(得分:2)
事实证明问题的原因是调试器 - 我是从Visual Studio的调试器启动Word。通过正常路径启动Word时,80080005代码消失。
-Patrick
答案 1 :(得分:0)
我没猜到你的代码,但听起来你正在调用CreateObject()
。如果Outlook已在运行,则需要致电GetObject()
。
首先,使用GetObject
查看Outlook是否已在运行(您需要捕获
错误)。