【问题标题】:C# Get running Outlook instance in VSTO add-inC# 在 VSTO 加载项中获取正在运行的 Outlook 实例
【发布时间】:2017-09-29 10:37:31
【问题描述】:

我正在尝试在我的 Excel 加载项中获取 Outlook 应用程序对象。

如果有一个正在运行的 Outlook 实例,它应该得到它,如果没有,它应该使用 Outlook 对象模型创建一个。

这是我现在的代码:

public static Outlook.Application GetApplicationObject()
{
    Outlook.Application application = null;

    if (Process.GetProcessesByName("OUTLOOK").Count() > 0)
    {
        application = Marshal.GetActiveObject("Outlook.Application") as Outlook.Application;
    }
    else
    {
        application = new Outlook.Application();
    }
    return application;
}

我的问题:它找到 Outlook 进程,但无法获取它们,抛出以下错误消息:

操作不可用(HRESULT 异常:0x800401E3 (MK_E_UNAVAILABLE))

我尝试一步步调试,并监控了任务管理器。我可以看到我有一个 Outlook 实例,但它只是任务栏右侧的一个图标。这是否意味着,实例尚未完全加载,无法访问,无法从中获取 Application 对象?

我最终修改了我的代码,并将 if-else 分成 2 个 try-catch,并各自返回,但我仍然认为上面的代码应该是可用的。

【问题讨论】:

    标签: c# outlook vsto outlook-addin


    【解决方案1】:

    Outlook 是一个单例,因此new Outlook.Application() 将始终有效 - 如果它已经在运行,您将获得该运行对象。

    确保两个应用(Excel 和 Outlook)在相同的安全上下文中运行。任一应用程序是否以提升的权限运行(以管理员身份运行)?

    【讨论】:

    • 这很有趣!我在网上看到了很多代码示例,其中包含“GetApplicationObject”函数,它显然应该获得一个正在运行的实例,或者创建一个新实例。但这清楚了,而 new Outlook.Application() 并没有不断地创建新实例!谢谢德米特里。顺便说一句,它们在相同的安全上下文中运行,具有相同的权限。
    猜你喜欢
    • 2020-09-18
    • 2017-11-04
    • 2020-07-29
    • 2023-02-24
    • 1970-01-01
    • 2014-05-10
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多