为什么在创建支持该接口的对象时会获得E_NOINTERFACE?

时间:2009-03-01 00:08:26

标签: c++ windows visual-studio-2008 com

注意:

  • 使用CoGetClassObject,通过系统注册表中有CLSID的类对象创建多个对象

  • 单线公寓

对于实例:

hresult = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);

IClassFactory *pIClassFactory;

hresult = CoGetClassObject (clsid, CLSCTX_LOCAL_SERVER, NULL, IID_IClassFactory, (LPVOID *)&pIClassFactory);


hresult = pIClassFactory->QueryInterface (IID_IUnknown, (LPVOID *)&pUnk);


hresult = pUnk->QueryInterface (__uuidof(IExample), (LPVOID *)&pISimClass);

注意:

  • 退回E_NOINTERFACE
    • * ppvObject设置为 NULL

问题:

  • 我如何确认,确实已经注册 - 如果这是问题?

2 个答案:

答案 0 :(得分:3)

这里的问题是你混淆了类对象和对象本身。 CoGetClassObject将为您提供指向实现IClassFactory的对象的指针,该对象旨在创建您感兴趣的对象的实例。它不是该对象的实际实例。

在您的示例中,您通过调用IUnknown指针上的QueryInterface来获取IClassFactory指针。此指针仍指向类对象的实例,因此对您感兴趣的接口执行QueryInterface会导致错误。相反,您需要调用IClassFactory::Createinstance来获取指向实际对象的IUnknown指针并在该指针上执行QueryInterface

答案 1 :(得分:1)

另外,看看CoCreateInstance函数。