2009-09-15 9 views
8

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?

Respuesta

9

que regrese E_POINTER cuando la referencia al puntero de un parámetro cabo es nulo, esto consideran que es un código de error que indica un error en el programa o en la capa de interoperabilidad.

Devuelve E_INVALIDARG cuando hay un nivel de aplicación activado con el parámetro por ejemplo fuera de rango o parámetro que colisionan entre sí.

en su caso, en SaveToFile(...) debe devolver E_INVLIADARG ya que no es válida para pasar el nombre de archivo vacío, y en GetAttributes(...) debe volver E_POINTER (si es un parámetro fuera) porque no se puede llenar el valor.

Y sí, todos nosotros L-O-V-E com :)

+0

¿Tiene alguna referencia de doc? – Constantin

+0

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. –

+0

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. –

Cuestiones relacionadas