获取并登录 Outlook 实例

本主题介绍如何获取代表活动 Outlook 实例的 Application 对象(如果该实例在本地计算机上运行)或创建新的 Outlook 实例,登录到默认配置文件并返回该 Outlook 实例。

[!注释] Helmut Obertanner 提供了以下代码示例。 Helmut 是 Microsoft 最有价值的专家 ,拥有 Microsoft Visual Studio Tools for Office 和 Microsoft Office Outlook 中的 Microsoft Office 开发工具方面的专业知识。

下面的托管代码示例是使用 C# 和 Visual Basic 编写的。 若要运行需调入组件对象模型 (COM) 的 .NET Framework 托管代码示例,您必须使用可定义托管接口并将其映射到对象模型类型库中的 COM 对象的互操作程序集。

对于 Outlook,您可以使用 Visual Studio 和 Outlook 主互操作程序集 (PIA)。 在您运行适用于 Outlook 2013 的托管代码示例之前,请确保您已安装了 Outlook 2013 PIA 并且已添加了对 Visual Studio 中的 Microsoft Outlook 15.0 对象库组件的引用。

应使用适用于 Visual Studio) 的 Office 开发人员工具在 Outlook 外接程序 (类中使用以下代码示例 ThisAddIn 。 代码中的 应用程序对象必须是由 提供的受信任 Outlook ThisAddIn.Globals对象。 有关使用 Outlook PIA 开发托管 Outlook 解决方案的详细信息,请参阅欢迎使用 MSDN 上的 Outlook 主互操作程序集参考

以下代码示例包含 GetApplicationObject 类的 Sample 方法,作为 Outlook 外接程序项目的一部分实现。 每个项目添加到 Outlook PIA,基于 Microsoft.Office.Interop.Outlook命名空间的引用。

方法GetApplicationObject使用 .NET Framework 类库中的类来检查和获取在本地计算机上运行的任何 Outlook 进程。 它首先使用 System.Diagnostics 命名空间中 Process 类的 GetProcessesByName 方法获取共享进程名称“OUTLOOK”的本地计算机上的进程组件数组。

若要检查数组是否至少包含一个 Outlook 进程, GetApplicationObject 请使用 Microsoft 语言集成查询 (LINQ) 。 System.Linq 命名空间中的 Enumerable 类提供一组方法,包括 Count 方法,用于实现 IEnumerable (T) 泛型接口。

由于 Array 类实现 IEnumerable (T) 接口, GetApplicationObject 因此可以将 Count 方法应用于 GetProcessesByName 返回的数组,以查看是否有正在运行的 Outlook 进程。 如果有,GetApplicationObject请使用 System.Runtime.InteropServices 命名空间中 Marshal 类的 GetActiveObject 方法获取该 Outlook 实例,并将该对象强制转换为 Outlook Application 对象。

如果 Outlook 未在本地计算机上运行,GetApplicationObject则创建 Outlook 的新实例,使用 NameSpace 对象的 Logon 方法登录到默认配置文件,并返回 Outlook 的新实例。

以下是 C# 代码示例。

using System; 
using System.Diagnostics; 
using System.Linq; 
using System.Reflection; 
using System.Runtime.InteropServices; 
using Outlook = Microsoft.Office.Interop.Outlook; 
 
namespace OutlookAddIn1 
{ 
    class Sample 
    { 
        Outlook.Application GetApplicationObject() 
        { 
 
            Outlook.Application application = null; 
 
            // Check if there is an Outlook process running. 
            if (Process.GetProcessesByName("OUTLOOK").Count() > 0) 
            { 
 
                // If so, use the GetActiveObject method to obtain the process and cast it to an Application object. 
                application = Marshal.GetActiveObject("Outlook.Application") as Outlook.Application; 
            } 
            else 
            { 
 
                // If not, create a new instance of Outlook and log on to the default profile. 
                application = new Outlook.Application(); 
                Outlook.NameSpace nameSpace = application.GetNamespace("MAPI"); 
                nameSpace.Logon("", "", Missing.Value, Missing.Value); 
                nameSpace = null; 
            } 
 
            // Return the Outlook Application object. 
            return application; 
        } 
 
    } 
}

以下是 Visual Basic 代码示例。

Imports System.Diagnostics 
Imports System.Linq 
Imports System.Reflection 
Imports System.Runtime.InteropServices 
Imports Outlook = Microsoft.Office.Interop.Outlook 
 
Namespace OutlookAddIn2 
    Class Sample 
 
        Function GetApplicationObject() As Outlook.Application 
 
            Dim application As Outlook.Application 
 
            Check if there is an Outlook process running. 
            If Process.GetProcessesByName("OUTLOOK").Count() > 0 Then 
 
                ' If so, use the GetActiveObject method to obtain the process and cast it to an Application object. 
                application = DirectCast(Marshal.GetActiveObject("Outlook.Application"), Outlook.Application) 
            Else 
 
                ' If not, create a new instance of Outlook and log on to the default profile. 
                application = New Outlook.Application() 
                Dim ns As Outlook.NameSpace = application.GetNamespace("MAPI") 
                ns.Logon("", "", Missing.Value, Missing.Value) 
                ns = Nothing 
            End If 
 
            ' Return the Outlook Application object. 
            Return application 
        End Function 
 
    End Class 
End Namespace

支持和反馈

有关于 Office VBA 或本文档的疑问或反馈? 请参阅 Office VBA 支持和反馈,获取有关如何接收支持和提供反馈的指南。