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

问题描述 投票:3回答:3

我正在试图从窗口服务,但得到的异常操作不可用钩到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);
        }
    }

但是当我启动它通过Windows窗体应用程序的精细工作相同的代码。我通过一些网站的走了,他们都在说,Outlook对象是不是在ROT表。会有怎样的解决方案。

c# .net outlook windows-services ms-office
3个回答
4
投票

Outlook或任何其他Office应用程序,不能在Windows服务运行,即使您的服务正在运行的交互式用户。只有扩展MAPI(C ++或Delphi只)或扩展MAPI包装等Redemption(其RDO家族对象)可以在服务中使用。

在你特定的情况下,它看起来像你正试图捕获Application.ItemSend事件。绝对没有任何理由来创建一个Windows服务。创建一个COM插件 - 它会通过Outlook中加载,如Outlook本身在同一个进程正在运行在相同的安全上下文,只要运行。


2
投票

两种常见问题可能导致此。

第一个是,你正在运行在管理员模式下Visual Studio和你从内VS开始你的计划,而Office应用程序是没有的。为了解决这个问题,你需要运行使用提升的权限您的Office应用程序,在管理员模式下,也是如此。

第二个可以通过未完全启动/当你调用Marshal.GetActiveObject(...)加载的应用程序引起的。


0
投票

你不需要让你的应用程序作为服务来获得它的背景...

如果你的WinForm的工作做好,只要把你的winform背景上的系统托盘的实例中运行

© www.soinside.com 2019 - 2024. All rights reserved.