Стоит ли проверять нулевой указатель в реализации QueryInterface ()? - PullRequest
1 голос
/ 15 сентября 2009

IUnknown :: QueryInterface () передается параметр void **, обозначающий адрес, куда следует поместить полученный интерфейс.

STDMETHOD QueryInterface(/* [in] */ REFIID riid, /* [iid_is][out] */ void** ppvObject)

Должна ли реализация QueryInterface () проверить этот указатель на нулевое значение (а затем сразу же вернуть E_POINTER) или просто записать туда?

Я видел много кода, связанного с COM, и почти везде проверка не выполняется. Гипотетически кто-то может передать нулевой указатель в качестве этого параметра, но нужна ли такая проверка?

Ответы [ 3 ]

4 голосов
/ 15 сентября 2009

Вам (звонившему) не нужно проверять указатель, чтобы не быть NULL.

Тем не менее, вы должны проверить возвращенный HRESULT. Метод вернет E_POINTER, если выходной указатель равен NULL и E_NOINTERFACE, если интерфейс не поддерживается.


Вызываемый должен проверить указатель на то, что он не является NULL, и вернуть E_POINTER, если он NULL:

MSDN : возвращаемое значение:

Этот метод возвращает S_OK, если интерфейс поддерживается, и E_NOINTERFACE в противном случае. Если ppvObject равно NULL, этот метод возвращает E_POINTER.

1 голос
/ 15 сентября 2009

Согласно документам MSDN , QueryInterface либо возвращает S_OK, и в этом случае параметр out будет установлен правильно. Или он возвращает E_NOINTERFACE, в этом случае параметр out не будет установлен.

Он вернет E_POINTER, если пустота **, которую вы передаете, равна NULL.

Я бы не стал проверять наличие нуля, скорее я бы проверил возвращаемое значение из IUnknown :: QueryInterface

Вероятно, нет ничего плохого в проверке на null, но с учетом гарантий интерфейса это выглядит как избыточная проверка.

0 голосов
/ 16 сентября 2009

Это зависит от того, какой тип COM-объекта вы используете (или какое приложение размещает вас). В большинстве случаев достаточно просто проверить HRESULT. Если вы имеете дело с объектами сторонних производителей (замена Проводника и т. Д.), Вам, вероятно, следует также проверить NULL. Проводник делает это, и поэтому вам нужно также, если вы хотите избежать сбоев в ошибочных расширениях:

...