1

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を実行して、さまざまな結果を達成しようとしました。違いはありません。

4

1 に答える 1

0

さて、私は何がうまくいくかを見つけました。

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

CLSID_MyCLassは、生成されたMyClass_TLB.cppファイルのGUID定数でした。クラスタイプに__uuidof(...)の代わりにそれを使用すると、すべてが正しく機能し始めることができました。

于 2012-11-09T18:33:41.493 に答える