2009-05-22 647 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 ...