通过 Windows 服务运行时操作不可用(来自 HRESULT 的异常:0x800401E3 (MK_E_UNAVAILABLE))?

Rav*_*nth 4 .net c# outlook windows-services ms-office

我试图从 Windows 服务挂钩到 Outlook 应用程序,但出现异常操作不可用(来自 HRESULT 的异常:0x800401E3(MK_E_UNAVAILABLE))这是我的代码。

   public void ItemSendEvent()
    {
        try
        {
           if (Process.GetProcessesByName(ApplicationConstants.OUTLOOK_PROCESS_NAME).Count() > 0)
                {
                    // If so, use the GetActiveObject method to obtain the process and cast it to an Application object.
                    outlookApplication = Marshal.GetActiveObject(ApplicationConstants.OUTLOOK_APPLICATION_NAME) as Microsoft.Office.Interop.Outlook.Application;
                    Microsoft.Office.Interop.Outlook.NameSpace nameSpace = outlookApplication.GetNamespace(ApplicationConstants.OUTLOOK_NAME_SPACE);
                    nameSpace.Logon("", "", Missing.Value, Missing.Value);
                    nameSpace = null;
                    outlookApplication.ItemSend += outlookApplication_ItemSend;
                }
                log.Info("Outlook Item Send event registered successfully.");
        }
        catch (System.Exception ex)
        {
            log.Error("Exception occurred while registering Outlook Item Send event. " + ex.Message);
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是当我通过 Windows 窗体应用程序启动它时,相同的代码工作正常。我浏览了一些网站,他们说 Outlook 对象不在 ROT 表中。什么是解决方案。

Dmi*_*nko 5

即使您的服务作为交互式用户运行,Outlook 或任何其他 Office 应用程序也无法在 Windows 服务中运行。只能在服务中使用扩展 MAPI(仅限 C++ 或 Delphi)或扩展 MAPI 包装器,如Redemption(其RDO系列对象)。

在您的特定情况下,您似乎正在尝试捕获该Application.ItemSend事件。绝对没有理由为此创建 Windows 服务。创建一个 COM 插件 - 它将由 Outlook 加载并运行,只要 Outlook 本身在同一安全上下文中的同一进程中运行。