Почему я получаю E_NOINTERFACE при создании объекта, поддерживающего этот интерфейс?
Примечание:
Использование 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)2
Проблема здесь в том, что вы путаете объект класса и сам объект. CoGetClassObject
предоставит вам указатель на объект, который реализует IClassFactory
и предназначен для создания экземпляра интересующего вас объекта. Это не фактический экземпляр этого объекта.
В вашем примере, вы получаете IUnknown
указатель, вызвав QueryInterface
на IClassFactory
указатель. Этот указатель по-прежнему указывает на экземпляр объекта класса, поэтому выполнение QueryInterface
для интересующего вас интерфейса приводит к ошибке. Вместо этого вам нужно вызвать, IClassFactory::Createinstance
чтобы получить IUnknown
указатель на фактический объект и выполнить действие QueryInterface
с этим указателем.