当通过赎回在线程中执行 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
。
我使用 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
。