C++ InterfaceSupportsErrorInfo:我如何知道接口ID?

C++ InterfaceSupportsErrorInfo:我如何知道接口ID?,c++,com,atl,C++,Com,Atl,我想使用InterfaceSupportsErrorInfo检查COM对象是否支持IErrorInfo。我不知道从哪里获取riid参数 我通过以下方式获得CComPtr: CoInitialize(NULL); CComPtr<IDispatch> pCOM; pCOM.CoCreateInstance(L"<ClassName>", NULL, CLSCTX_ALL); CoInitialize(空); 首席采购官pCOM; pCOM.CoCreateInstance

我想使用InterfaceSupportsErrorInfo检查COM对象是否支持IErrorInfo。我不知道从哪里获取riid参数

我通过以下方式获得CComPtr:

CoInitialize(NULL);
CComPtr<IDispatch> pCOM;
pCOM.CoCreateInstance(L"<ClassName>", NULL, CLSCTX_ALL);
CoInitialize(空);
首席采购官pCOM;
pCOM.CoCreateInstance(L“”,NULL,CLSCTX_ALL);
然后我从pCOM->InvokeN调用中得到一个失败的HRESULT。 我知道该对象支持IErrorInfo,因为GetErrorInfo成功返回它,但我想知道如何正式检查接口是否受支持

我试过了

CComQIPtr<ISupportErrorInfo, &IID_ISupportErrorInfo> pSupportErrorInfo(pCOM);
pSupportErrorInfo->InterfaceSupportsErrorInfo(IID_IDispatch);
CComQIPtr pSupportErrorInfo(pCOM);
pSupportErrorInfo->接口支持ErrorInfo(IID_IDispatch);

但它返回S_FALSE。

它不适用于通过IDispatch::Invoke()进行的后期绑定调用。通过IErrorInfo获得的相同信息通过传递给Invoke()的EXEPINFO参数返回。您必须提前知道IID,不能动态查询它。您必须使用用于进行失败调用的接口的IID。您正在将对象创建为
IDispatch
,因此IID是
IID\u Dispatch
,但是如果这对
InterfaceSupportsErrorInfo()
不起作用,那么您就无能为力了。为什么要使用
IDispatch
而不是
IsoDerivedInterface
?@HansPassant谢谢,EXCEPINFO真的很管用。我不明白为什么微软没有在CComPtr::InvokeN方法中利用它。@RemyLebeau,真遗憾。我想使用IDispatch进行后期绑定。
InterfaceSupportsErrorInfo
可能会为IDispatch后代返回true,但不会为IDispatch本身返回true。因此,正如前面所说,你必须知道
iid
。或者,通常您可以通过
IProvideClassInfo
获取该标识符。