Официально не следует использовать параметры [out]
из COM-функций, если функция не завершилась успешно. Это означает, что есть (по крайней мере) три способа узнать, можно ли использовать параметр [out]
.
Рассмотрим следующий интерфейс
interface IFoo : IUnknown {
HRESULT GetOtherFoo([out] IFoo** ppFoo);
HRESULT Bar();
};
Какой из следующих способов вы бы порекомендовали для его использования?
<сильный>1. Проверить возвращаемое значение
CComPtr<IFoo> other;
HRESULT hr = foo->GetOtherFoo(&other);
if (SUCCEEDED(hr))
other->Bar();
Это заставляет меня немного нервничать, поскольку ошибка в IFoo
может вызвать разыменование указателя NULL
.
<сильный>2. Проверьте выходной параметр
Это зависит от того факта, что если метод дает сбой, он не должен изменять ни один из [out]
параметров (если параметр изменился ‹==> его можно безопасно использовать).
CComPtr<IFoo> other;
foo->GetOtherFoo(&other);
if (other)
other->Bar();
Обратите внимание, что такое происходит в любом случае, деструктор CComPtr
вызовет Release
, если указатель не NULL
, поэтому он не может быть мусором.
<сильный>3. Параноидальный способ, проверьте оба
CComPtr<IFoo> other;
HRESULT hr = foo->GetOtherFoo(&other);
if (SUCCEEDED(hr) && other)
other->Bar();
На мой взгляд, это немного многословно.
P.S. См. связанный вопрос.