COM相互運用機能に適切に登録してCOMを表示したC#dllがあります。cppbuilderを使用して、ラッパークラスを生成するタイプライブラリをインポートしました。現在、C#クラスのインスタンスを作成するために使用しようとしています。ただし、C++コードでREGDB_E_CLASSNOTREGエラーが発生します。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#アプリにはもう1つの依存関係があります。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またはインターフェイスとは異なります。
x86モードとx64モードの両方で手動でregasmを実行して、さまざまな結果を達成しようとしました。違いはありません。