#import приводит к HRESULT 0x80040154 "Незарегистрированный класс"

Я пытаюсь использовать COM DLL из VC++ 2005. Я создал TestCOMlib.dll с ATL, создал простой интерфейс ISimple и добавил одно свойство (тип LONG, имя Property01) и один метод (имя Method01).

Кажется, DLL правильно зарегистрирована в системе (я использую OleView для проверки записей).

Я создал простое диалоговое приложение MFC для использования COM DLL. Я использую директиву #import для включения информации из библиотеки типов. Visual studio создала для меня файл tlh и tli.

Затем я попытался получить интерфейс ISimple, но я получаю ошибку 0x80040154. Код, который я запускаю внутри тестового приложения, выглядит следующим образом:

HRESULT hr = S_OK;
hr = CoInitialize(NULL);

ISimplePtr myRef(__uuidof(ISimple));

// Test prop and method
myRef->Property01 = 5;
LONG test = myRef->Property01;
LONG ret = myRef->Method01(_T("Test input"));
ret = myRef->Method01(NULL);

myRef = NULL;
CoUninitialize();

Строка, возвращающая ошибку 0x80040154: ISimplePtr myRef (__uuidof (ISimple)). OleView правильно отображает интерфейс и в реестре записи кажутся хорошими.

Что я делаю неправильно? Любая идея?

С уважением

1 ответ

Решение

Базовый класс для этих интеллектуальных COM-указателей - _com_ptr_t. Вы пытаетесь использовать этот конструктор:

// Constructs a smart pointer given the CLSID of a coclass. This 
// function calls CoCreateInstance, by the member function
//  CreateInstance, to create a new COM object and then queries for 
// this smart pointer's interface type. If QueryInterface fails with 
// an E_NOINTERFACE error, a NULL smart pointer is constructed.
explicit _com_ptr_t( 
   const CLSID& clsid,  
   IUnknown* pOuter = NULL,  
   DWORD dwClsContext = CLSCTX_ALL 
);

Ключевым моментом является то, что вы должны передать CLSID Coclass, вы передаете IID интерфейса. Вот почему __uuidof(Simple) работает.

Другие вопросы по тегам