http://www.codeproject.com/KB/COM/index.aspx?#COM/DCOM/COM+%20-%20Beginnersで、初心者向けの優れた記事のコレクションを見つけました。これは:
http://www.codeproject.com/KB/COM/hellocom.aspx、http://www.codeproject.com/KB/COM/comintro2.aspx、
http://www.codeproject.com/KB/COM/ comintro.aspx、http://www.codeproject.com/KB/COM/com_server_without_mfc_atl.aspx、http://www.codeproject.com/KB/COM/com_in_c1.aspx
ただし、COM オブジェクトのプログラミングを開始する場合は、COM のスレッド モデルを理解することが非常に重要です。これはここで非常によく説明されています
http://www.codeproject.com/KB/COM/CCOMThread.aspx、http://www.codeproject.com/KB/COM/CCOMThread2.aspx
しかし、もう少し現代的な方法を選択することを提案したいので、私はあなたに答えることにしました. COM テクノロジは非常に古いものです。Dot NET にはすべての機能が組み込まれており、永続的に開発されます。したがって、Building COM Servers in .NETからのアプローチが最も興味深いと思います。COM を C# で完全に記述すると、COM オブジェクトの開発は次の 2 つの部分に分けられます。
- 実装なしでインターフェイスのみのアセンブリを作成し、登録します。
- この COM インターフェイスを実装する .NET クラスを開発します。
http://www.codeproject.com/KB/COM/COMinDotNet.aspx 、http://www.codeproject.com/KB/cs/CreateActiveXDotNet.aspx、http : //msdn.microsoft.com/en-us/library/ms973807.aspxですが、http://www.codeproject.com/KB/COM/BuildCOMServersInDotNet で説明されている「.NET で COM サーバーを構築する」方法をお勧めします。 aspx。
コメントの後の更新: 申し訳ありませんが、複雑な問題を解決する簡単な方法を探しています。それは無理だ。
オブジェクト指向の C++ と COM の間には、準類似性にもかかわらず、多くの主要な違いがあることを理解することは非常に重要です。COM はオブジェクト指向言語ではなく、バイナリ プロトコルであることを理解しておくことが重要です。ソフトウェア コンポーネント (COM オブジェクト) は、再利用可能なコードのバイナリ単位です。オブジェクト指向アプローチに基づいて設計されたプログラムのモジュールを個別にコンパイルする際に存在する多くの問題を解決します。
たとえば、誰かがあなたのクラスを継承し、後でいくつかのプライベート メンバーを変更した場合、継承されたすべてのクラスに影響を与えます。C++ オブジェクトを使用する完全なコードは、少なくとも変更されているため、再コンパイルする必要がありますsizeof(object)
。オブジェクトを使用するすべてのユーザーがオブジェクト クラスを継承しないため、このような問題は COM には存在しません。1 つは、インターフェイスを介してオブジェクトを使用します。この署名sizeof()
は、基本クラスのプライベート メンバーを変更しても変更されません。Don Box による古典的な本「 Essential COM」の最初の章で、いくつかの非常に良い例をオンラインで読むことができます。en&sa=X&oi=book_result&resnum=6&ct=結果. また、小さな記事http://edndoc.esri.com/arcobjects/9.0/ArcGISDevHelp/DevelopmentEnvs/COM/IntroToCOM.htmを読んで、 COM と C++ オブジェクトの違いをさらに理解することをお勧めします。
C++ オブジェクトを COM オブジェクトとして書き直す場合は、スレッド モデルを選択する必要があります。スレッド セーフなプログラムの作成方法を理解するか、シングル スレッド アパートメント モデルを使用する必要があります。すべてのオブジェクトは、別のスレッドに存在します (割り当てられて実行されています)。アウト プロセス COM オブジェクトを選択すると (すべてのオブジェクトを含む exe が作成されます)、新しいプロセスが作成されます。誰かがオブジェクトのメソッドを呼び出すと、すべてのパラメーターのマーシャリングが行われます。パラメータのマーシャリングとは、別のスレッドでメモリを割り当て、すべてのパラメータをそのスレッドにコピーすることを意味します。前に説明したことはすべて、C++ オブジェクトの用語ではありません。これを書いているのは、COM が実際には C++ オブジェクト モデルと同じではないことを明確にするためだけです。
したがって、既存の C++ オブジェクトをラップするには、いくつかの純粋な仮想クラス (オブジェクトに実装するインターフェイス) を定義する必要があります。このインターフェイスは、IDL/MIDL ( Microsoft Interface Definition Language ) で記述されている必要があります。これが最も重要なことです!次に、既存の C++ クラスを使用して、これらのインターフェイスを COMコクラスとして実装する必要があります。
これらの作業を .NET で行う場合、COM 開発者が通常必要とする多くの実装の詳細を調べる必要はないと確信しています。C#/C++ (純粋な仮想クラス) でインターフェイスを定義してコンパイルするだけです。Visual Studio 内で強力な署名付きアセンブリの秘密キーを生成できます。「署名」部分のプロジェクト設定に移動し、「アセンブリに署名する」を選択してから、「新しい」厳密な名前のキーファイルを選択します。それはすべてです。このようにして、COM インターフェイスを完全に定義します。インターフェイスの MIDL バージョンが生成されます。
次に、C# または C++ で新しいプロジェクトを作成し、以前に定義したインターフェイスを継承するクラスを宣言します。このインターフェイスの実装中に、既存の C++ オブジェクト全体を使用できます。そのため、ターゲットをすばやくリッチにすることができます。http://www.codeproject.com/KB/COM/BuildCOMServersInDotNet.aspxで詳細に説明されている方法に従ってください。この方法を使用すると、C++ での従来の COM 実装について知っておく必要がある多くの技術的な詳細を調べる必要がなくなります。そして、古くて事実上死んでいる (またはそれ以上開発されていない) COM を研究する代わりに、最新の .NET を研究します。
長い回答で申し訳ありません。