#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) работает.