CComQIPtr
- для случаев, когда вы хотите удобно позвонить на QueryInterface()
, чтобы узнать, поддерживается ли интерфейс:
IInterface1* from = ...
CComQIPtr<IInterface2> to( from );
if( to != 0 ) {
//supported - use
}
Таким образом, вы можете запросить интерфейс от указателя на любой(несвязанный) интерфейс COM и проверьте, успешно ли выполнен этот запрос.
CComPtr
используется для управления объектами, которые наверняка поддерживают некоторый интерфейс.Вы используете его как обычный умный указатель с подсчетом ссылок.Это похоже на CComQIPtr
, но не позволяет использовать описанный выше вариант использования, и это повышает безопасность типов.
Этот код:
IUnknown* unknown = ... ;
CComQIPtr<IDispatch> dispatch( unknown );
компилируется и, возможно, возвращает нулевой указатель, еслиunknown
привязан к объекту, который не реализует IDispatch
.Теперь вы должны проверить это во время выполнения, что хорошо, если вы хотите проверить во время выполнения, но плохо, если вы предпочитаете проверку типа времени компиляции.
Этот код:
IUnknown* unknown = ... ;
CComPtr<IDispatch> dispatch( unknown );
просто не скомпилируется - выдает
ошибка C2664: 'ATL :: CComPtr :: CComPtr (IDispatch *) throw ()': невозможно преобразовать параметр 1 из 'IUnknown *' в 'IDispatch * '
, что обеспечивает лучшую безопасность типов времени компиляции.