Frage

COM-Schnittstellen Methoden verschiedene HRESULT Werte zurückgeben können unzulässige Argument übergebenen Werte zu signalisieren. Wann kehre ich E_POINTER und wenn E_INVALIDARG?

Wie ich verstehe, wenn eine Methode einen Index in einer gekapselten Sammlung empfängt und es ist Grenzen aus, die E_INVALIDARG ist. Wenn eine Methode empfängt einen Interface** Zeiger, wo es gemeint ist, einen Zeiger auf ein neu erstellte Objekt zu speichern, die 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 ist, wenn es einen WCHAR* Puffer mit einem Dateinamen als „in“ Parameter empfängt und diese WCHAR* ist null? Ist das E_POINTER oder E_INVALIDARG?

oder ein Verfahren, erhält einen Zeiger auf einige Struktur und erwartet, dass die Struktur durch diesen Zeiger zu füllen und dieser Zeiger ist null - das ist E_POINTER oder E_INVALIDARG

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 und wenn E_INVALIDARG zurückzukehren, wenn Zeigertyp Parameter überprüfen?

War es hilfreich?

Lösung

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

Sie kehren E_INVALIDARG, wenn ein Anwendungsebene auf den Parameter zum Beispiel außerhalb des Bereichs Ausgabe oder Parameter, die miteinander kollidieren.

In Ihrem Fall in SaveToFile(...) Sie sollten E_INVLIADARG zurückkehren, da sie 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:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top