2016-12-07 19 views
2

在線程中通過GetMessageFromID()獲取MAPI_E_UNKNOWN_ENTRYID我使用了Redemption(http://dimastr.com/redemption/home.htm)來開發我的Outlook AddIn。當我在第一次在STA線程(!)中嘗試GetMessageFromId時都很好,但是在下一次我得到MAPI_E_UNKNOWN_ENTRYID。我通過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提供商應該是在處理指定入口ID,因爲(最有可能)的提供商尚未在該屆會議上加載並沒有n要擁有有機會在會議中註冊其MAPI系統的入口ID。

你可以嘗試指定調用GetMessageFromId(贖回會首先打開指定的存儲和調用IMsStore::OpenEntry代替IMAPISession::OpenEntry)當存儲條目ID,但真正的解決辦法是避免所有的人創造一個全新的MAPI會話 - 因爲你的代碼在Outlook中,已經有Outlook使用的MAPI會話:只需將Outlook的RDOSession.MAPIOBJECT屬性設置爲Namespace.MAPIOBJECT即可。在這種情況下,不是請致電RDOSession.Logoff

+0

感謝您的回覆。但是我不能將'RDOSession.MAPIOBJECT'設置爲'Namespace.MAPIOBJECT',因爲它可以工作到線程中,或者我錯了? –

+0

謝謝。在調用'GetMessageFromId'時使用'RDOStore'得到了幫助。 –

+0

請設置MAPIOBJECT屬性,不要在您的插件中創建新的會話。線程將會非常好 - 在主線程上存儲Namespace.MAPIOBJECT的值。在輔助線程上,創建RDOSession的新實例,將MAPIOBJECT屬性設置爲保存在主線程中的值。這樣,名稱空間OOM對象永遠不會在線程之間傳遞,只有MAPIOBJECT屬性中的IMAPISession(這非常好)。 –