Согласно документам MSDN , QueryInterface либо возвращает S_OK, и в этом случае параметр out будет установлен правильно. Или он возвращает E_NOINTERFACE, в этом случае параметр out не будет установлен.
Он вернет E_POINTER, если пустота **, которую вы передаете, равна NULL.
Я бы не стал проверять наличие нуля, скорее я бы проверил возвращаемое значение из IUnknown :: QueryInterface
Вероятно, нет ничего плохого в проверке на null, но с учетом гарантий интерфейса это выглядит как избыточная проверка.