2009-09-15 3 views
8

COM-Schnittstellen-Methoden können verschiedene HRESULT Werte zurückgeben, um ungültige ungültige Argumentwerte zu signalisieren. Wann gebe ich E_POINTER und wann E_INVALIDARG zurück?Wann zurück E_POINTER und wenn E_INVALIDARG?

Wie ich verstehe, wenn eine Methode einen Index in einer gekapselten Sammlung empfängt und es außerhalb der Grenzen ist, ist E_INVALIDARG. Wenn eine Methode einen Zeiger Interface** empfängt, wo es einen Zeiger auf ein neu erstelltes Objekt speichern soll, das E_POINTER ist.

HRESULT CImpl::GetItem(long index; Interface** result) 
{ 
    if(result == 0) { 
     return E_POINTER; 
    } 
    if(index < 0 || index >= internalArray.size()) { 
     return E_INVALIDARG; 
    } 
    *result = CreateWrapperObject(internalArray[index]); 
    return S_OK; 
} 

Aber was, wenn es mit einem Dateinamen als „in“ Parameter und diese WCHAR* ist ein WCHAR* Puffer empfängt null? Ist das E_POINTER oder E_INVALIDARG?

Oder eine Methode empfängt einen Zeiger auf irgendeine Struktur und wird erwartet, die Struktur durch diesen Zeiger zu füllen, und dieser Zeiger ist Null - ist das E_POINTER oder ?

HRESULT CImpl::SaveToFile(WCHAR* fileName) 
{ 
    if(fileName == 0) { 
     return // what to return here? 
    } 
    //... do actual work here 
} 

HRESULT CImpl::GetAttributes(Attributes* to) 
{ 
    if(to == 0) { 
     return // what to return here? 
    } 
    attributes->IsCool = getIsCool(); 
    attributes->Color = RGB(0, 255, 0); 
    return S_OK; 
} 

Was sind die Regeln dafür, wann E_POINTER zurückzukehren und wenn E_INVALIDARG bei der Überprüfung Parameter Zeigertyp?

Antwort

9

Sie kehren E_POINTER, wenn der Verweis auf den Zeiger eines aus Parameter null ist, dies betrachten ein Fehlercode zu sein, der einen Fehler im Programm oder in der Interop-Schicht anzeigt.

Sie geben E_INVALIDARG zurück, wenn eine Anwendungsebene mit dem Parameter aktiviert ist, z. B. außerhalb der Bereichsausgabe oder Parameter, die miteinander kollidieren.

In Ihrem Fall in SaveToFile(...) sollten Sie E_INVLIADARG zurückkehren, da es nicht gültig ist leer Dateinamen zu übergeben, und in GetAttributes(...) sollten Sie E_POINTER zurückkehren (wenn es sich um eine aus param ist), weil der Wert nicht füllen kann.

Und ja, wir alle L-O-V-E com :)

+0

Haben Sie irgendwelche Doc-Referenzen? – Constantin

+0

Einverstanden. Ich würde wirklich gerne eine MSDN-Referenz für diese sehen. Das oben Gesagte macht einen Sinn, aber es wäre gut, die kanonische Definition zu haben. –

+0

Ich bin mir nicht sicher, ob diese Antwort richtig ist. Zum Beispiel wird in VS2010 '' in der 'AtlSetChildSite()' Implementierung 'E_POINTER' zurückgegeben, wenn der' punkChild' Parameter 'NULL' ist, stattdessen gemäß dieser Antwort (wenn ich es richtig verstanden habe),' E_INVALIDARG "hätte in diesem Fall zurückgegeben werden sollen. Ich denke, dass ATL eine gute Quelle für gute COM-Programmierpraktiken ist, daher sollte "E_POINTER" in den allgemeinen Fällen von ungültigen (z.B. "NULL") Zeigern zurückgegeben werden. Aber ehrlich gesagt bin ich mir auch nicht sicher, und ich stimme zu, dass einige offizielle MSDN-Referenzen gut wären. –

Verwandte Themen