Почему я получаю E_NOINTERFACE при создании объекта, который поддерживает этот интерфейс? - PullRequest
0 голосов
/ 01 марта 2009

Примечание:

  • Использование 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 ]

3 голосов
/ 01 марта 2009

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

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

1 голос
/ 02 марта 2009

Также взгляните на функцию CoCreateInstance.

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