У меня есть 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, чтобы попытаться получить разные результаты. Нет отличий
Ну, я узнал, что будет работать.
IMyClassPtr obj;
HRESULT hr = obj.CreateInstance(CLSID_MyClass);
CLSID_MyCLass была константой guid в сгенерированном файле MyClass_TLB.cpp. Использование его вместо __uuidof (…) для типов классов позволило всем начать работать правильно.
Других решений пока нет …