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?
Haben Sie irgendwelche Doc-Referenzen? – Constantin
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. –
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. –