我正在使用 COM 创建 VSTO 2007 Outlook Addin。它从 Outlook 中读取所有邮件项,并将未投递的邮件项标记(类别)为未投递。
我正在使用以下代码将未送达的邮件项目标记为未送达。以读取颜色标记的代码有时会崩溃。请向我提出问题。
HRESULT hrGetSelectedItem;
LPDISPATCH spOlSelectedItem = NULL;
CComPtr<Outlook::_Explorer> spExplorer;
//Locating the selected item
CComPtr<Outlook::Selection> spOlSel;
if(m_spApp)
{
//Get the Currently Active Explorer on the top of Desktop
hrGetSelectedItem = m_spApp->ActiveExplorer(&spExplorer);
if(SUCCEEDED(hrGetSelectedItem))
{
hrGetSelectedItem = spExplorer->get_Selection(&spOlSel);
if(FAILED(hrGetSelectedItem))
{
MessageBox(NULL,GetStringFromTable(IDS_SELECTITEM),MSGBOX_HEADER, MB_OK|MB_ICONINFORMATION);
return ;
}
iMailIndex+=1;
VARIANT covIndex;
covIndex.vt = VT_I4;
covIndex.lVal = iMailIndex;
if(spOlSel)
{
hrGetSelectedItem = spOlSel->Item(covIndex,&spOlSelectedItem);
CComQIPtr <Outlook::_MailItem> spMailItem;
if(spOlSelectedItem)
{
hrGetSelectedItem = spOlSelectedItem->QueryInterface(&spMailItem);//Get The selected item
if(spMailItem)
{
spMailItem->put_Categories(L"Undelivered");
spMailItem->Save();
}
}
}
}
} LPDISPATCH spOlSelectedItem = NULL;
CComPtr<Outlook::_Explorer> spExplorer;
//Locating the selected item
CComPtr<Outlook::Selection> spOlSel;
if(m_spApp)
{
//Get the Currently Active Explorer on the top of Desktop
hrGetSelectedItem = m_spApp->ActiveExplorer(&spExplorer);
if(SUCCEEDED(hrGetSelectedItem))
{
hrGetSelectedItem = spExplorer->get_Selection(&spOlSel);
if(FAILED(hrGetSelectedItem))
{
MessageBox(NULL,GetStringFromTable(IDS_SELECTITEM),MSGBOX_HEADER, MB_OK|MB_ICONINFORMATION);
return ;
}
iMailIndex+=1;
VARIANT covIndex;
covIndex.vt = VT_I4;
covIndex.lVal = iMailIndex;
if(spOlSel)
{
hrGetSelectedItem = spOlSel->Item(covIndex,&spOlSelectedItem);
CComQIPtr <Outlook::_MailItem> spMailItem;
if(spOlSelectedItem)
{
hrGetSelectedItem = spOlSelectedItem->QueryInterface(&spMailItem);//Get The selected item
if(spMailItem)
{
spMailItem->put_Categories(L"Undelivered");
spMailItem->Save();
}
}
}
}
}
提前致谢。