1

すべての StackOverFlow 兄弟の助けを借りて、COM 経由で C# クラスを呼び出し、データを外部アプリケーションとやり取りする C++ DLL を作成することができました。そのコードが機能し始めた後、王国では多くのお祝いがありました。

今、私は新しい問題を抱えています。DLL を拡張して、さまざまなクラスを呼び出せるようにしています (すべて同じインターフェイスを実装しています)。ロード時に DLL に渡される char 配列に応じて、呼び出すクラスを決定する必要があります。呼び出すメソッドは、使用するクラスに関係なくまったく同じです。DLL を呼び出すときにクラスを切り替える最良の方法は何ですか?

 // Initialize COM. 
 HRESULT hr = CoInitialize(NULL);



// I want to do something like this....but how? 
if (strcmp(modelType, "Model1") == 0) { 
        IUnitModelPtr pIUnit(__uuidof(ClassOne));
    }   

    if (strcmp(modelType, "Model2") == 0) { 
        IUnitModelPtr pIUnit(__uuidof(ClassTwo));
    }


//call method 1

//call method 2

CoUninitialize();

//exit

これはおそらくかなり単純な質問ですが、私は C++ をまったく知りません。COM を動かすことだけが、私にとって大きな挑戦でした。

編集:これを達成するための非常にエレガントな方法がいくつかあると確信しています(反射?)が、提案を簡単に実装できるものに限定してください....ここでは効率は重要ではなく、保守性は実際には問題ではありません。

4

2 に答える 2

2

次のようにします。

GUID classId = GUID_NULL;
if( strcmp( modelType, "Model1" ) == 0 ) {
    classId = __uuidof( class1 );
} else if( strcmp( modelType, "Model2" ) == 0 ) {
    classId = __uuidof( class2 );
} else if(... etc, continue for all possible model types
}
IUnitModelPtr unit;
unit.CreateInstance( classId );
// interface methods can be called here
于 2009-03-09T14:18:23.987 に答える
1

2 つのオプション。

それぞれの異なるインターフェイスの実装はコクラスであり、C++ コードは正しい prog-id/classid を使用して作成を実行します。

または、公開されたコクラスは、実際の実装クラスを返すメソッドを持つファクトリです。

modelTypeどちらも、実装クラスにマップするロジックが必要です。これは、C++ コードまたは .NET コードで行うことができます。全体的なコンテキストに関する詳細情報なし (文字列 --> コクラス マッピング論理的に COM コンポーネントまたは呼び出し元の一部)。

(純粋な C++ COM 実装では、独自のカスタム COM インスタンス ファクトリを作成できますが、これはより高度な COM であり、.NET COM 相互運用には使用できません。)

于 2009-03-09T14:19:45.107 に答える