2009-05-22 640 views
3

我是一些ATL代码,使用智能COM指针迭代通过MS Outlook联系人,并在一些PC上,我得到COM错误0x80004003('无效的指针')为每联系。相同的代码在其他PC上运行良好。代码如下所示:COM错误0x80004003(无效指针)访问MS Outlook联系人

_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()); 
    } 
} 

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

+0

一个可能的检查。 contactitem是否为空?我不会这么想,因为你提前检查计数,但值得一试。 – 2009-05-22 06:40:23

回答

0

只是猜测: 也许地址簿中的“FullName”字段为空,这就是为什么指针无效?

很难说,因为您的代码并未指明您正在使用哪个COM接口。

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

这是否有什么区别?

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

在我的示例中,您将NULL值设置为适当的文本值。

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

因此,请在将某些类型库导入到您的项目后检查文件* .tlh ...