当通过赎回在线程中执行 GetMessageFromID() 时,我得到 MAPI_E_UNKNOWN_ENTRYID

I get MAPI_E_UNKNOWN_ENTRYID when do GetMessageFromID() in thread through Redemption

我使用 Redemption (http://dimastr.com/redemption/home.htm) 来开发我的 Outlook 加载项。当我第一次在 STA-thread(!) 中尝试 GetMessageFromId 时一切正常,但在下一次我得到 MAPI_E_UNKNOWN_ENTRYID.

    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;
            }
           }
        } 
    }

我做错了什么?

MAPI_E_UNKNOWN_ENTRYID 表示当前 MAPI 会话(通过调用 RDOSession.Logon 创建)不知道应该由哪个 MAPI 提供程序处理指定的条目 ID,因为(很可能)该提供程序尚未加载但是在该会话中,并没有机会在会话中向 MAPI 系统注册其条目 ID 集。

可以尝试在调用GetMessageFromId时指定店铺入口id(兑换会先打开指定的店铺,调用IMsStore::OpenEntry而不是IMAPISession::OpenEntry),但真正的解决办法是完全避免创建全新的 MAPI 会话 - 因为您的代码在 Outlook 中,所以 Outlook 已经使用了 MAPI 会话:只需从 Outlook 中将 RDOSession.MAPIOBJECT 属性 设置为 Namespace.MAPIOBJECT。在那种情况下不要调用RDOSession.Logoff