Los métodos de las interfaces COM pueden devolver varios valores de HRESULT
para señalar los valores de los argumentos inválidos pasados. ¿Cuándo devuelvo E_POINTER
y cuándo E_INVALIDARG
?¿Cuándo devuelve E_POINTER y cuándo E_INVALIDARG?
Como entiendo si un método recibe un índice en una colección encapsulada y está fuera de límites que es E_INVALIDARG
. Si un método recibe un puntero Interface**
donde está destinado a almacenar un puntero a un objeto recién creado que es E_POINTER
.
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;
}
Pero lo que si recibe un buffer WCHAR*
con un nombre de archivo como un "in" parámetro y esto WCHAR*
es nulo? ¿Es esto E_POINTER
o E_INVALIDARG
?
O un método recibe un puntero a alguna estructura y se espera que llene la estructura a través de ese puntero y este puntero es nulo, ¿es este E_POINTER
o 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;
}
¿Cuáles son las reglas de cuándo debe regresar E_POINTER
y cuando E_INVALIDARG
Tras un análisis de los parámetros de tipo puntero?
¿Tiene alguna referencia de doc? – Constantin
De acuerdo. Realmente me gustaría ver una referencia de MSDN para esto. Lo anterior tiene algún sentido, pero sería bueno tener la defunción canónica. –
No estoy seguro de que esta respuesta sea correcta. Por ejemplo, en VS2010 '', en la implementación 'AtlSetChildSite()', 'E_POINTER' se devuelve si el parámetro' punkChild' es 'NULL', en lugar de acuerdo con esta respuesta (si lo he entendido correctamente),' E_INVALIDARG 'debería haber sido devuelto en ese caso. Creo que ATL es una buena fuente de buenas prácticas de programación COM, por lo que tal vez 'E_POINTER' debería ser devuelto en los casos generales de punteros no válidos (por ejemplo, 'NULL'). Pero, francamente, tampoco estoy seguro, y acepto que alguna referencia oficial de MSDN sería buena. –