|
ATL 还提供了 CComQIPtr,它具有用于查询 COM 对象以检索额外接口的更简单的语法。 但是,建议采用 CComPtr ,因为它能够执行 CComQIPtr 执行的所有操作,并且在语义上与原始 COM 接口指针更一致。 如果您可以使用 CComPtr 来查询接口,新接口指针将被放在输出参数中。 如果调用失败,则会返回 HRESULT,它是典型的 COM 模式。 如果使用 CComQIPtr,返回值将为指针本身,并且当调用失败时,内部 HRESULT 返回值将无法访问。 以下两行显示了 CComPtr 和 CComQIPtr 中的错误处理机制的差异。
// CComPtr with error handling:
CComPtr<IMediaControl> pControl;
hr = pGraph->QueryInterface(IID_PPV_ARGS(&pControl));
if(FAILED(hr)){ /*... handle hr error*/ }
// CComQIPtr with error handling
CComQIPtr<IMediaEvent> pEvent = pControl;
if(!pEvent){ /*... handle NULL pointer error*/ }
// Use the second interface.
hr = pControl->Run();
if(FAILED(hr)){ /*... handle hr error*/ }
|
|