2016-06-02 14 views
2

Я пытаюсь подключиться к Outlook приложения из Windows Service, но получить исключение. Операция недоступна (Исключение из HRESULT: 0x800401E3 (MK_E_UNAVAILABLE)) вот мой код.Операция недоступна (Исключение из HRESULT: 0x800401E3 (MK_E_UNAVAILABLE)) при работе через службу Windows?

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 с его работой Fine. я прошел через некоторые сайты, и они говорили, что объект outlook не находится в таблице ROT. каково будет решение.

+0

Я бы * догадался, что вы не можете сделать это через сеансы. Возможно, вашей службе потребуется запустить код в сеансе пользователя, если он хочет поговорить с экземпляром пользователя Outlook. (Что бы вы ожидали, что опубликованный код будет работать, если два или более пользователей одновременно будут работать с Outlook?) –

ответ

1

Возможны две общие проблемы.

Первое, что вы используете Visual Studio в режиме администратора, и вы запускаете свою программу из VS, а приложение Office - нет. Чтобы исправить это, вам нужно запустить приложение Office с повышенными привилегиями в режиме администратора.

Второй может быть вызван тем, что приложение не было полностью запущено/загружено при вызове Marshal.GetActiveObject(...).

+0

К сожалению, это неверно, но ответ Дмитрия –

2

Outlook или любое другое приложение Office нельзя запускать в службе Windows, даже если ваша служба работает как интерактивный пользователь. В службе может использоваться только расширенный MAPI (только C++ или Delphi) или расширенная оболочка MAPI, например Redemption (ее объекты семейства RDO).

В вашем конкретном случае, похоже, вы пытаетесь захватить событие Application.ItemSend. Для этого нет никаких оснований для создания службы Windows. Создайте COM-аддон - он будет загружен Outlook и запустится до тех пор, пока сам Outlook будет запущен.

+0

hello dmitry Я создал приложение winforms, которое отлично работает и умеет чтобы получить событие отправки товара и получить все детали, но я хочу, чтобы это выполнялось в фоновом режиме в качестве сервисов и тихо фиксировало все детали. :) –

+0

Снова вы не сможете, так как контексты безопасности различны. Вам действительно нужно написать COM-аддон (dll), который будет загружен в-proc Outlook. –

0

вам не нужно иметь приложение как сервис, чтобы получить его на фоне ...

если ваш WinForm работает хорошо, просто поставить свой WinForm в фоновом режиме работает на трей, например