2009-05-22 8 views
3

Ich bin ein ATL-Code, der Smart-COM-Zeiger verwendet, um MS Outlook-Kontakte zu durchlaufen, und auf einigen PCs bekomme ich einen COM-Fehler 0x80004003 ('ungültiger Zeiger') Kontakt. Derselbe Code funktioniert auch auf anderen PCs. Der Code sieht so aus:COM-Fehler 0x80004003 (ungültiger Zeiger) Zugriff MS Outlook-Kontakte

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

Ich frage mich, ob andere Anwendungen/Add-Ins dies verursachen könnten? Jede Hilfe wäre willkommen.

+0

Eine mögliche Überprüfung. Ist contactiem immer null? Ich würde nicht denken, weil Sie im Voraus die Zählung überprüfen, aber es ist einen Versuch wert. –

Antwort

0

Nur eine Vermutung: Vielleicht das Feld "FullName" im Adressbuch ist leer und deshalb ist der Zeiger ungültig?

schwer zu sagen, weil Ihr Code nicht angibt, welche COM-Schnittstellen Sie verwenden.

1

FullName ist eine Eigenschaft, und Sie tun die GET-Operation (es ist wahrscheinlich so in IDL: get_FullName ([out, retval] BSTR * o_sResult)). Eine solche Operation funktioniert mit Nullwerten.

Meine Annahme ist, dass contactItem Smart-Zeiger auf ein beliebiges gültiges COM-Objekt zeigt. In diesem Fall kann die Formatierung durch ATLTRACE das Problem verursachen. Intern verhält es sich wahrscheinlich wie Standard sprintf("",args...) Funktion. wie unten etwas tun

Zur Vermeidung solcher Probleme:

ATLTRACE(_T("\tContact name: %s\n"), 
_bstr_t(contactitem->FullName)?static_cast<LPCTSTR>(contactitem->FullName):"(Empty)") 
0

Hat dies einen Unterschied machen?

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

In meinem Beispiel formatieren Sie NULL-Wert auf einen richtigen Textwert.

Wenn die Frage über den Unterschied zwischen FullName (als Eigenschaft) und GetFullName() (als Methode) lautet, lautet die Antwort nein. Eigenschaft und Methode sollten dasselbe Ergebnis liefern. Manchmal kann die Eigenschaft anderen Methoden zugeordnet werden als setXXX und getXXX. Dies kann durch Verwendung einer bestimmten Syntax in IDL (und in Wirklichkeit in TLB nach der Kompilierung von IDL zu TLB) erreicht werden. Wenn die Eigenschaft FullName nicht der Methode GetFullName zugeordnet ist, erzielen Sie ein anderes Ergebnis.

Bitte überprüfen Sie die Datei * .tlh nach dem Importieren einer Typbibliothek in Ihr Projekt ...