如何在Outlook PIA实现中处理应用程序生存期

本文关键字:处理 应用程序 生存期 实现 PIA Outlook | 更新日期: 2023-09-27 18:26:15

问题陈述

当Outlook退出时,通过PIA注册的任何事件都将丢失,并且当前内存中的任何PIA对象都将不可访问。

复制

以下是一个简单的控制台应用程序,说明了当前的问题:

static void Main(string[] args)
{
    var outlookApp = new Application();
    var ns = outlookApp.GetNamespace("MAPI");
    var calendar = ns.GetDefaultFolder(OlDefaultFolders.olFolderCalendar);
    var appointment = (AppointmentItem) calendar.Items.GetFirst();
    ((ApplicationEvents_11_Event) outlookApp).Quit +=
        () => Console.WriteLine("Outlook is quitting");
    while (true)
    {
        Console.WriteLine("Explorers: " + outlookApp.Explorers.Count);
        Console.WriteLine("Folders: " + ns.Folders.Count);
        Console.WriteLine("Items: " + calendar.Items.Count);
        Console.WriteLine("Start date: " + appointment.Start);
        Thread.Sleep(2000);
    }
}

当我运行此应用程序时,如果Outlook尚未运行,它会在单独的进程中启动Outlook实例(显示在系统托盘中)。据我所知,有三种情况会导致Quit事件触发:

  1. Outlook处于"隐藏"状态,从系统任务栏图标的上下文菜单中选择立即退出即可退出
  2. 启动应用程序时,Outlook已在运行,用户关闭或退出正在运行的资源管理器
  3. 应用程序启动时Outlook未运行,因此以"隐藏"状态启动,但随后用户通过运行可执行文件或从系统任务栏图标的上下文菜单中选择"打开Outlook"来启动Outlook应用程序。然后用户关闭或退出正在运行的资源管理器

其中每一个对我的程序都有相同的影响:Quit事件被触发,然后我访问Outlook对象的一次尝试失败,并显示COMException

问题

处理此问题的标准或推荐方法是什么?从理论上讲,应用程序退出可以在任何时候异步发生。如果发生异常,我是否需要在任何使用PIA的操作上捕获COMException,并从对new Application()的调用重新启动该操作?这可能很棘手,这取决于操作的复杂性。

事件处理程序呢?是否需要跟踪已添加到Outlook对象的所有事件处理程序,然后在收到Application.Quit事件时重新添加它们?

用户体验呢?假设用户从系统托盘的上下文菜单中选择了立即退出,然后图标立即重新出现,因为我的应用程序检测到退出并重新初始化了所有内容。我是否应该向用户弹出某种对话框,通知他们我需要Outlook才能使我的应用程序正常运行?

在系统关闭的情况下该怎么办?大概在从Outlook收到Application.Quit之前,我会收到一个SystemEvents.SessionEnding事件。这是有保证的吗?还是我应该在恢复通信之前等待一段时间,看看系统是否正在崩溃?是否有其他方法可以检测我们是否处于会话结束状态?

为这个多方面的问题道歉。如果有一篇文章已经涉及到这个主题,欢迎链接到阅读材料。经过大量搜索,我还没有找到。

如何在Outlook PIA实现中处理应用程序生存期

如果Application.Quit没有启动,您可以挂接Explorer.Close和Inspector.Close事件,并检查Aplication.Explorers.Count和Aplication.IInspectors.Count是否都为0(或1,因为您正在处理的事件仍打开窗口)。

若要连接这些事件,请跟踪Application.Explorers.NewExplorer和Application.Inspectors.NewInspector事件。若要连接Outlook已显示的资源管理器和检查器,请在启动时循环浏览Application.explorers和Application.Expectors集合。