2009-09-15 10 views
8

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?

Odpowiedz

9

powrót E_POINTER gdy odniesienie do wskaźnika z zewnątrz parametr jest null, to uważa się, że kod błędu wskazuje na błąd w programie lub w warstwie międzyoperacyjne.

Zwracasz , gdy poziom aplikacji jest włączony z parametrem, na przykład poza zasięgiem problemu lub parametrem, który koliduje ze sobą.

w przypadku, w SaveToFile(...) należy zwrócić E_INVLIADARG ponieważ nie jest ważne, aby przekazać pustą nazwę pliku, a w GetAttributes(...) należy zwrócić E_POINTER (jeśli jest to param out), ponieważ nie można wypełnić wartości.

I tak, wszyscy L-O-V-E com :)

+0

Czy masz jakieś odniesienia do dokumentów? – Constantin

+0

Uzgodnione. Naprawdę chciałbym zobaczyć referencję MSDN do tego. Powyższe ma jakiś sens, ale dobrze byłoby mieć kanoniczną deflację. –

+0

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

Powiązane problemy