我是一些使用智能 COM 指针循环访问 MS Outlook 联系人的 ATL 代码,在某些 PC 上我收到每个联系人的 COM 错误 0x80004003(“无效指针”)。相同的代码在其他 PC 上运行良好。代码如下所示:
_ApplicationPtr ptr;
ptr.CreateInstance(CLSID_Application);
_NameSpacePtr ns = ptr->GetNamespace(_T("MAPI"));
MAPIFolderPtr folder = ns->GetDefaultFolder(olFolderContacts);
_ItemsPtr items = folder->Items;
const long count = items->GetCount();
for (long i = 1; i <= count; i++)
{
try
{
_ContactItemPtr contactitem = items->Item(i);
// The following line throws a 0x80004003 exception on some machines
ATLTRACE(_T("\tContact name: %s\n"), static_cast<LPCTSTR>(contactitem->FullName));
}
catch (const _com_error& e)
{
ATLTRACE(_T("%s\n"), e.ErrorMessage());
}
}
我想知道是否有任何其他应用程序/加载项可能导致此问题?欢迎任何帮助。
最佳答案
FullName 是一个属性,您执行 GET 操作(在 IDL 中可能是这样的:get_FullName([out,retval] BSTR *o_sResult))。这样的操作适用于空值。
我的假设是 contactItem
智能指针指向任何有效的 COM 对象。在这种情况下,由 ATLTRACE
完成的格式化操作可能会导致问题。在内部,它的行为可能类似于标准的 sprintf("",args...)
函数。
要避免此类问题,请执行以下操作:
ATLTRACE(_T("\tContact name: %s\n"),
_bstr_t(contactitem->FullName)?static_cast<LPCTSTR>(contactitem->FullName):"(Empty)")
关于c++ - COM 错误 0x80004003(无效指针)访问 MS Outlook 联系人,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/896602/