连接到现有Outlook进程

时间:2010-06-26 02:59:02

标签: c# outlook office-interop

我正在构建一个在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"));

2 个答案:

答案 0 :(得分:2)

事实证明问题的原因是调试器 - 我是从Visual Studio的调试器启动Word。通过正常路径启动Word时,80080005代码消失。

-Patrick

答案 1 :(得分:0)

我没猜到你的代码,但听起来你正在调用CreateObject()。如果Outlook已在运行,则需要致电GetObject()

首先,使用GetObject查看Outlook是否已在运行(您需要捕获 错误)。