c # 4.0 — C # COM dll имеет ошибку REGDB_E_CLASSNOTREG в проекте C ++

У меня есть C # dll, который я правильно зарегистрировал для COM Interop, и сделал COM видимым. Используя cppbuilder, я импортировал библиотеку типов, которая генерировала классы-обертки, и теперь я пытаюсь использовать для создания экземпляра моего класса C #. Тем не менее, я получаю ошибку REGDB_E_CLASSNOTREG в моем коде C ++. Я проверил dll в реестре, и даже перерегистрировал его с regasm. Без изменений. Чего мне не хватать?

Вот мой код C ++:

_MyClassPtr obj;
HRESULT hr = obj.CreateInstance(__uuidof(MyClass));
//now hr equals REGDB_E_CLASSNOTREG

Я также попробовал это так:

IMyClass* obj;
HRESULT hr = CoCreateInstance(__uuidof(MyClass), NULL, CLSCTX_INPROC_SERVER, __uuidof(IMyClass), (void**) &obj);
//same result, hr equals REGDB_E_CLASSNOTREG

У меня есть еще одна зависимость в приложении C #. Я также зарегистрировал его для COM без разницы, но не импортировал его библиотеку типов в проект C ++.

ОБНОВЛЕНИЕ: основываясь на комментариях ниже, я обнаружил, что CreateInstance ищет guid класса в следующих местах реестра:

HKCU\Software\Classes\Wow6432Node\CLSID\{guid}
HKCR\Wow6432Node\CLSID\{guid}
HKCU\Software\Classes\CLSID\{guid}
HKCR\CLSID\{guid}

Но, просматривая реестр, единственной записью в любом узле CLSID, связанной с моей сборкой, является guid для самой сборки, которая, конечно, отличается от guid для класса или интерфейса.

Я вручную запустил режим regasm как в режиме x86, так и в режиме x64, чтобы попытаться получить разные результаты. Нет отличий

1

Решение

Ну, я узнал, что будет работать.

IMyClassPtr obj;
HRESULT hr = obj.CreateInstance(CLSID_MyClass);

CLSID_MyCLass была константой guid в сгенерированном файле MyClass_TLB.cpp. Использование его вместо __uuidof (…) для типов классов позволило всем начать работать правильно.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]