2016-12-07 13 views
2

Я использовал Redemption (http://dimastr.com/redemption/home.htm) для разработки моей Outlook AddIn. Когда я впервые запускаю GetMessageFromId в STA-потоке (!), Все в порядке, но в следующий раз я получаю MAPI_E_UNKNOWN_ENTRYID.Я получаю MAPI_E_UNKNOWN_ENTRYID, когда GetMessageFromID() в потоке через Redemption

RDOSession rdoSession = null;. 
    rdoSession = new RDOSession(); 
    if (rdoSession != null) 
    { 
     if (!rdoSession.LoggedOn) 
      rdoSession.Logon(Consts.ProfileName); 
     if (rdoSession.LoggedOn) 
     { 
      for (int c = 1; c <= rdoStoresCnt; c++) 
      { 
      /* other code */ 
      RDOMail mail = null; 
      try 
      { 
       mail = rdoSession.GetMessageFromID(entryID); 
       /* other code */ 
      } 
      catch (Exception ex) 
      { 
      if (mail != null) Marshal.ReleaseComObject(mail); mail = null; 
      } 
      finally 
      { 
      if (mail != null) Marshal.ReleaseComObject(mail); mail = null; 
      } 
      } 
     } 
    } 

Что я делаю неправильно?

ответ

1

MAPI_E_UNKNOWN_ENTRYID означает, что текущий сеанс MAPI (созданный по телефону RDOSession.Logon) не знает, какой поставщик MAPI должен обрабатывать указанный идентификатор записи, потому что (скорее всего) поставщик еще не был загружен на этом сеансе и не имел возможность зарегистрировать свой набор идентификаторов входа в систему MAPI в сеансе.

Вы можете попробовать указать въездной магазин идентификатор при вызове GetMessageFromId (Redemption будет открыть указанный магазин первый и вызвать IMsStore::OpenEntry вместо IMAPISession::OpenEntry), но реальное решение не создавать совершенно новый сеанс MAPI на всех - так как код находится внутри Outlook, уже существует сеанс MAPI, используемый Outlook: просто установите свойство RDOSession.MAPIOBJECT для Namespace.MAPIOBJECT из Outlook. Do не звоните RDOSession.Logoff в этом случае.

+0

Спасибо за ответ. Но я не могу установить 'RDOSession.MAPIOBJECT' в' Namespace.MAPIOBJECT', потому что он работает в потоке, или я ошибаюсь? –

+0

Спасибо. Использование «RDOStore» при вызове «GetMessageFromId» помогло. –

+0

Устанавливайте свойство MAPIOBJECT, НЕ создавайте новый сеанс внутри своего аддона. Threading будет прекрасно - сохраните значение Namespace.MAPIOBJECT в основном потоке. На вторичном потоке создайте новый экземпляр RDOSession, установите для свойства MAPIOBJECT значение, сохраненное в основном потоке. Таким образом, объект OOM пространства имен никогда не передается между потоками, а только IMAPISession из свойства MAPIOBJECT (что совершенно нормально). –