Metody interfejsów COM mogą zwracać różne wartości HRESULT
sygnalizujące niepoprawne wartości argumentów. Kiedy mam zwrócić E_POINTER
i kiedy E_INVALIDARG
?Kiedy powraca E_POINTER i kiedy E_INVALIDARG?
Jak rozumiem, jeśli metoda otrzymuje indeks w zamkniętej kolekcji i jest poza granicami, która jest E_INVALIDARG
. Jeśli metoda otrzyma wskaźnik Interface**
, w którym ma przechowywać wskaźnik do nowo utworzonego obiektu, który jest 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;
}
Ale co jeśli otrzyma bufor WCHAR*
z nazwy pliku jako „w” i parametr ten WCHAR*
jest zerowy? Czy to jest E_POINTER
lub E_INVALIDARG
?
Lub metoda otrzymuje wskaźnik do jakiejś struktury i oczekuje się, że wypełni strukturę za pośrednictwem tego wskaźnika, a ten wskaźnik jest pusty - czy jest to E_POINTER
lub 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;
}
Jakie są zasady podczas powrotu E_POINTER
a kiedy E_INVALIDARG
podczas kontroli parametrów typ wskaźnika?
Czy masz jakieś odniesienia do dokumentów? – Constantin
Uzgodnione. Naprawdę chciałbym zobaczyć referencję MSDN do tego. Powyższe ma jakiś sens, ale dobrze byłoby mieć kanoniczną deflację. –
Nie jestem pewien, czy ta odpowiedź jest poprawna. Na przykład w VS2010 '', w implementacji "AtlSetChildSite()', zwracane jest 'E_POINTER', jeśli parametr' punkChild' ma wartość 'NULL', zamiast tego zgodnie z tą odpowiedzią (jeśli dobrze zrozumiałem),' E_INVALIDARG 'powinno zostać zwrócone w takim przypadku. Uważam, że ATL jest dobrym źródłem dobrych praktyk programowania COM, więc może 'E_POINTER' powinien zostać zwrócony w ogólnych przypadkach nieprawidłowych (np.' NULL') wskaźników. Ale szczerze mówiąc, nie jestem też pewien i zgadzam się, że niektóre oficjalne referencje MSDN byłyby dobre. –