Wenn Rückkehr E_POINTER und wenn E_INVALIDARG?
-
07-07-2019 - |
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?
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:)