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

我试图从Windows服务挂钩到Outlook应用程序,但得到一个exception操作不可用(HRESULTexception: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 Form Application启动它时它的工作正常。 我经历了一些网站,他们说Outlook对象不在ROT表中。 什么是解决方案。

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

在您的特定情况下,看起来您正在尝试捕获Application.ItemSend事件。 绝对没有理由为此创建Windows服务。 创建一个COM插件 – 它将由Outlook加载并在Outlook本身运行时运行。

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

第一个是您在管理员模式下运行Visual Studio,而您是从VS内部启动程序,而Office应用程序则不是。 要解决此问题,您还需要在管理员模式下以提升的权限运行Office应用程序。

第二种情况可能是由于当您调用Marshal.GetActiveObject(...)时应用程序未完全启动/加载。

您不需要将您的应用程序作为服务来获取它在后台…

如果你的winform运行良好,只需将你的winform放在运行于系统托盘上的后台