c++ - COM 错误 0x80004003(无效指针)访问 MS Outlook 联系人

标签 c++ com outlook atl

我是一些使用智能 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/

相关文章:

c++ - 在析构函数中调用 Inherited IUnknown::Release()

c# - 使用 EWS/以编程方式使用 Outlook 日记条目

mysql - 如何将 Outlook .pst 文件中的电子邮件转储到 MySQL 数据库中?

c++ - 二维码生成算法数据屏蔽实现案例分析

c++ - 在 C++ 项目中包含 Pistache

c++ - VSCode 中的 Cpp - 如何编译到其他文件夹

c++ - 来自 IWbemClassObject::Get 的未知异常

c++ - 重写虚函数仅通过调用约定有什么不同意味着什么?

c# - 为什么需要在 C# 中使用 DispId 注释?

vba - 无法在一台计算机上从 Excel/VBA 保存 PDF