【发布时间】:2010-07-06 15:21:03
【问题描述】:
以上可以吗?
我可以这样做吗:
IUnknown *punk;
punk->QueryInterface(IID_MyInterface, (void**)&m_pMyInterface);
我认为这会告诉我 MyInterface 是否受支持 m_pMyInterface...
【问题讨论】:
以上可以吗?
我可以这样做吗:
IUnknown *punk;
punk->QueryInterface(IID_MyInterface, (void**)&m_pMyInterface);
我认为这会告诉我 MyInterface 是否受支持 m_pMyInterface...
【问题讨论】:
如果你的意思是你上面写的,那么不是:因为你的 punk 是一个未初始化的指针。
通常你需要调用CoCreateInstance 来创建某个东西的实例;之后,您可以在该实例上调用QueryInterface,询问它支持什么接口。
【讨论】:
你不能那样做。提议的 sn-p 将测试punk 指向的对象是否支持IID_MyInterface 的接口,如果它支持接口指针,则将检索到m_pMyInterface,并且AddRef() 将在检索到的指针上被调用.由于 punk 未初始化,它不指向任何有效对象,因此尝试调用 QueryInterface() 会导致未定义的行为 - 您的程序可能会崩溃。
为了测试m_pMyInterface 指向的对象是否支持IID_MyInterface 的接口,您需要执行以下操作:
IUnknown* punk;
HRESULT hr = m_pMyInterface->QueryInterface(IID_MyInterface, (void**)&punk);
if( SUCCEEDED( hr ) ) {
//the interface is supported - don't forget that AddRef() has been called
} else {
//the interface is not supported
}
只有在m_pMyInterface 已经指向一个活动的 COM 对象时才能完成后者。
【讨论】: