Вызывать QueryInterface до CoCreateInstance? - PullRequest
0 голосов
/ 06 июля 2010

Возможно ли вышеупомянутое?

Могу ли я сделать это:

IUnknown *punk;

punk->QueryInterface(IID_MyInterface, (void**)&m_pMyInterface);

Я думал, что это скажет мне, если MyInterface поддерживается m_pMyInterface ...

Ответы [ 2 ]

5 голосов
/ 06 июля 2010

Если вы действительно имеете в виду то, что написали выше, то нет: ваш punk является неинициализированным указателем.

Обычно вам нужно вызвать CoCreateInstance, чтобы создать экземпляр чего-либо; после этого вы можете вызвать QueryInterface для этого экземпляра, чтобы спросить, какие интерфейсы он поддерживает.

1 голос
/ 07 июля 2010

Вы не можете этого сделать.Предложенный фрагмент будет проверять, поддерживает ли объект, на который указывает 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-объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...