Почему я получаю 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)

Решение

Проблема здесь в том, что вы путаете объект класса и сам объект. CoGetClassObject предоставит вам указатель на объект, который реализует IClassFactory и предназначен для создания экземпляра интересующего вас объекта. Это не фактический экземпляр этого объекта.

В вашем примере, вы получаете IUnknown указатель, вызвав QueryInterface на IClassFactory указатель. Этот указатель по-прежнему указывает на экземпляр объекта класса, поэтому выполнение QueryInterface для интересующего вас интерфейса приводит к ошибке. Вместо этого вам нужно вызвать, IClassFactory::Createinstanceчтобы получить IUnknown указатель на фактический объект и выполнить действие QueryInterface с этим указателем.

Также обратите внимание на функцию CoCreateInstance.