2010-07-06 3 views

Répondre

5

Si vous voulez dire vraiment ce que vous avez écrit ci-dessus, pas: car votre punk est un pointeur non initialisé.

Normalement, vous devez appeler CoCreateInstance pour créer une instance de quelque chose; après cela, vous pouvez appeler QueryInterface sur cette instance, pour demander quelle interface [s] il prend en charge.

+0

alors que si le CoCreateInstance retourne E_NOINTERFACE, que puis-je faire? –

+0

@Tony Cela signifie que la classe spécifiée ne supporte pas cette interface: donc si vous voulez toujours créer une instance, soit spécifier une classe différente, soit spécifier une interface différente. – ChrisW

+0

@Tony: demandez à CoCreateInstance de renvoyer IID_IUnknown, puis faites QueryInterface. –

1

Vous ne pouvez pas faire cela. L'extrait proposé testerait si l'objet pointé par punk prend en charge l'interface avec IID_MyInterface et s'il prend en charge le pointeur d'interface serait récupéré dans m_pMyInterface et AddRef() aurait été appelé sur le pointeur récupéré. Comme punk n'est pas initialisé, il ne pointe sur aucun objet valide, donc essayer d'appeler QueryInterface() entraînerait un comportement indéfini - votre programme tomberait probablement en panne.

Afin de tester si l'objet pointé par m_pMyInterface prend en charge l'interface avec IID_MyInterface vous devez faire ce qui suit:

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 
} 

Ce dernier ne peut se faire si m_pMyInterface déjà pointé un live objet COM .

Questions connexes