我正在试图从窗口服务,但得到的异常操作不可用钩到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表。会有怎样的解决方案。
Outlook或任何其他Office应用程序,不能在Windows服务运行,即使您的服务正在运行的交互式用户。只有扩展MAPI(C ++或Delphi只)或扩展MAPI包装等Redemption(其RDO家族对象)可以在服务中使用。
在你特定的情况下,它看起来像你正试图捕获Application.ItemSend
事件。绝对没有任何理由来创建一个Windows服务。创建一个COM插件 - 它会通过Outlook中加载,如Outlook本身在同一个进程正在运行在相同的安全上下文,只要运行。
两种常见问题可能导致此。
第一个是,你正在运行在管理员模式下Visual Studio和你从内VS开始你的计划,而Office应用程序是没有的。为了解决这个问题,你需要运行使用提升的权限您的Office应用程序,在管理员模式下,也是如此。
第二个可以通过未完全启动/当你调用Marshal.GetActiveObject(...)
加载的应用程序引起的。
你不需要让你的应用程序作为服务来获得它的背景...
如果你的WinForm的工作做好,只要把你的winform背景上的系统托盘的实例中运行