Официально не следует использовать параметры [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. См. связанный вопрос .