6

アプリケーションのビジネスレイヤー層を表す既存のc++オブジェクトモデルがあります。オブジェクトモデルを他の言語(vbscript、VB、javascriptなど)で記述されたアプリケーションに公開できるようにしたいのです。これを行う最良の方法は、ビジネスオブジェクトをCOMレイヤーでラップすることだと思います。

これを行うには、どのような高速で効果的な方法がありますか。アドバイス、実用的な「ハウツー」ドキュメントへのリンクをいただければ幸いです。

私はこれで賞金稼ぎを始めているので、潜在的な賞金稼ぎのためのいくつかの追加のガイドラインがあります:1)私はATLアプローチを決定しました2)私は今本当に良い「方法と迅速さ」へのリンクを特に探しています既存のc++オブジェクトモデルをラップして、javascriptなどのスクリプト言語で使用できるようにするためのドキュメント3)cpp、idl、hpp /など、どのファイルにどのコードを追加する必要があるかを示す小さな作業例のあるものhなど。理解を深めるためにテストと変更をコンパイルできる例を含める必要があります。

補遺.....さらなる文脈。私にとって、これは約10年後のCOMへの再訪問です。私は2000年より前の3年間、MFCとATL COMを実行しました。COMとは何か、C ++での実装に使用される原則、スレッドモデルなどを理解しています。重要な原則、それ以上にガイド付きの再学習体験になります。

もっと時間があれば、Troelsenによる「COMとATL 3.0の開発者向けワークショップ」を掘り下げたいと思います。これは非常に優れた本ですが、非常に遅いキック(再)開始です。

コメントに続くさらなるコンテキスト..........。

可能な限りシンプルに保つ、シングルスレッドアパートメントモデルとインプロセスdll。

4

2 に答える 2

6

http://www.codeproject.com/KB/COM/index.aspx?#COM/DCOM/COM+%20-%20Beginnersで、初心者向けの優れた記事のコレクションを見つけました。これは:

http://www.codeproject.com/KB/COM/hellocom.aspxhttp://www.codeproject.com/KB/COM/comintro2.aspxhttp://www.codeproject.com/KB/COM/ comintro.aspxhttp://www.codeproject.com/KB/COM/com_server_without_mfc_atl.aspxhttp://www.codeproject.com/KB/COM/com_in_c1.aspx

ただし、COM オブジェクトのプログラミングを開始する場合は、COM のスレッド モデルを理解することが非常に重要です。これはここで非常によく説明されています

http://www.codeproject.com/KB/COM/CCOMThread.aspxhttp://www.codeproject.com/KB/COM/CCOMThread2.aspx

しかし、もう少し現代的な方法を選択することを提案したいので、私はあなたに答えることにしました. COM テクノロジは非常に古いものです。Dot NET にはすべての機能が組み込まれており、永続的に開発されます。したがって、Building COM Servers in .NETからのアプローチが最も興味深いと思います。COM を C# で完全に記述すると、COM オブジェクトの開発は次の 2 つの部分に分けられます。

  1. 実装なしでインターフェイスのみのアセンブリを作成し、登録します。
  2. この COM インターフェイスを実装する .NET クラスを開発します。

http://www.codeproject.com/KB/COM/COMinDotNet.aspx 、http://www.codeproject.com/KB/cs/CreateActiveXDotNet.aspxhttp : //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 を研究します。

長い回答で申し訳ありません。

于 2010-05-03T16:23:19.517 に答える
2

http://www.lambdasoft.dk/Comet/index.htm

Cometは、COMとC++の間の言語バインディングです。これにより、ATLまたはMFCに依存することなく、COMクライアントとCOMサーバーの両方のプログラミングを実行できます。言い換えれば、CometはATLの代替品です。

于 2010-04-08T13:28:27.703 に答える