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

Posted

技术标签:

【中文标题】COM 错误 0x80004003(无效指针)访问 MS Outlook 联系人【英文标题】:COM Error 0x80004003 (Invalid Pointer) access MS Outlook contacts 【发布时间】:2010-10-28 03:37:58 【问题描述】:

我是一些 ATL 代码,它使用智能 COM 指针遍历 MS Outlook 联系人,在某些 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());
    

我想知道是否有任何其他应用程序/加载项可能导致此问题?欢迎任何帮助。

【问题讨论】:

一个可能的检查。 contactitem 是否为空?我认为不会,因为您要提前检查计数,但值得一试。 【参考方案1】:

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)")

【讨论】:

【参考方案2】:

只是猜测: 也许通讯录中的“FullName”字段为空,这就是指针无效的原因?

很难说,因为您的代码没有指明您正在使用哪些 COM 接口。

【讨论】:

【参考方案3】:

这有什么不同吗?

ATLTRACE(_T("\tContact name: %s\n"), static_cast<LPCTSTR>(contactitem->GetFullName()));

【讨论】:

【参考方案4】:

在我的示例中,您将 NULL 值格式化为正确的文本值。

如果问题是关于 FullName(作为属性)和 GetFullName()(作为方法)之间的区别,那么答案是否定的。属性和方法应该给出相同的结果。有时属性可以映射到不同的方法,然后是 setXXX 和 getXXX。它可以通过在 IDL 中使用一些特定的语法来实现(实际上是在将 IDL 编译为 TLB 之后的 TLB 中)。如果属性 FullName 没有映射到方法 GetFullName 那么你会得到不同的结果。

所以请在将一些类型库导入您的项目后检查文件 *.tlh...

【讨论】:

以上是关于COM 错误 0x80004003(无效指针)访问 MS Outlook 联系人的主要内容,如果未能解决你的问题,请参考以下文章

来自 PREfast 的指针无效访问(读取 0*1 的 4 个字节)错误

`main' 中的错误:free():无效指针(尽管没有使用 free 或 delete)

“运行时错误:无效的内存地址或无指针取消引用”创建表

realloc 使用详解(分析realloc invalid pointer指针无效等错误)

C++ 字符串:无效的指针错误

作业帮助,分段错误,双重释放或损坏,free():无效指针