2009-05-22 132 views
3

スマートCOMポインターを使用してMS Outlookの連絡先を繰り返し使用するATLコードがありますが、一部の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

可能なチェックが1つあります。 contactitemはいつもヌルですか?私はあなたが時間の前に数をチェックしているので、それは試してみる価値があるとは思いません。 –

答えて

0

ちょっと推測します。 アドレス帳の "FullName"フィールドが空で、ポインタが無効なのはなぜですか?

あなたのコードはあなたが使用しているCOMインターフェイスを示していないので、わかりにくいです。

1

FullNameはプロパティであり、GET操作を行います(おそらくIDLではget_FullName([out、retval] BSTR * o_sResult)))。このような操作はnull値で正常に動作します。

私の前提として、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を確認してください。

関連する問題