コンポーネントオブジェクトモデルを学ぶのに最適な場所[非公開]


13

現在のプロジェクトでCOMを学ぶ必要があります。私は初心者であり、COMの良い出発点を見つけることができませんでした。私はMSDNを調べてグーグルで調べています... codeproject.comで興味深い記事を見つけましたが、満足していません。なぜCOMを使用するのですか?なぜ存在するのですか?どの場所に存在しますか?.....などなど..では、これらの質問に対する答えをどこで見つけられるか教えてください。


3
なぜCOMを使用するのですか?たいていはしないようにします。どの場所に存在しますか?痛みを伴うレガシーコードベース、一般的に。
Carson63000

@carson実際には、「COM」オブジェクトの値を取得する必要がある監視ソフトウェアを開発しています。したがって、新しく発見されたクエスト..
チャニ

1
COMの最高の3つのWeb記事のうち、2つはMSDN(古い雑誌記事)にあり、1つはCodeProjectにありました。(そして、「COM」を検索したときに「.com」TLDのサイトのみを返すGoogleに感謝します...)
rwong

@ Carson63000本当に痛い...今すぐ泣きそうになります。
エヴィカトス

回答:


18
  • まず、COMはオブジェクト指向プログラミングのようなものです。COMインターフェイスは抽象インターフェイスです。
  • COMには、各言語固有の組み込みOOPよりも利点があります。COMクラスを異なる言語で実装したり、異なるバージョンのコンパイラでコンパイルしたりでき、それらは相互運用できます。これは「アプリケーションバイナリインターフェイス」(ABI)と呼ばれます
  • COMは参照カウントを使用します。最初はうっとうしいかもしれませんが、スマートポインターについて学習するとすぐに、人生がずっと楽になり、参照カウントの概念が非常に理解しやすくなることがわかります。
  • COMは、クラスキャストの奇妙な方法、つまり「クエリインターフェイス」を使用します。

IUnknownを学習することが最初のステップです。

初心者の学習に適した優れたCOMインターフェイスは、IStreamインターフェイスです。データを格納するさまざまな方法を使用してIStreamインターフェイスを実装することにより、COMを実践できます。


2012/09/28を追加:

COMメカニズムが発明された後、Microsoftの人々は、これらのメカニズムがオーソドックスなOOPではない異常なプログラミングトリックへの扉を開くことを発見しました。最下位レベルIUnknown.QueryInterfaceは単なるメソッドです。何でもできます。これらのトリックは、OOPから借用できる基本的な推論を無効にできるため、学習者にとってCOMを威圧します。

MSDNのMicrosoftのドキュメントは、「COMは...ではない」または「仮定しない」と多くの時間を費やして、これらの異常なトリックがコードを破壊する方法を説明しています。

COMデザイナーはLiskov Substitution Principle(SOLIDの「L」)を使用して、複数のインターフェイスとトリックの使用が基本的なOOPの推論やプログラム操作を無効にしないようにします。

プロジェクトでこれらのトリックを使用しない場合、OOPの観点からのみCOMを表示してもかまいません。プロジェクトでこれらのトリックを使用する場合、COMを自己修正コードとして表示する必要があります。

(ジョーク:私たちはLで多くの時間を費やさなければならず、通常は他の4つの原則を無視します。)


9

COMの主な理由は、アプリケーションと他のアプリケーション、および異なるメモリ空間に存在する可能性のあるdllとの間、および異なる内部オブジェクト表現を持つ可能性のあるオブジェクト間にオブジェクト指向通信インターフェースを提供することです。

COMを学習する際に覚えておくべきことは、当時C ++が王であり、アプリケーションがCを使用してdllを呼び出していたことです。一般的なABI(@rwongが言うように)はなく、COMはMicrosoftソリューションでした

おそらく、Visual StudioのActive Template Library(ATL)を見てみる価値はあります。これにより、COMの使用も少し簡単になります。

昔私が便利だと思った本

http://www.amazon.com/Essential-COM-Don-Box/dp/0201634465/ref=sr_1_1?ie=UTF8&qid=1304946825&sr=8-1

http://www.amazon.com/Understanding-ActiveX-OLE-Developers-Technology/dp/1572312165/ref=pd_sim_b_4

hth


7

私はもともと、Learning DCOMからCOMについて学びました(DCOMはCOMの単なる拡張であり、本はほとんどCOMについてです)。これは10年以上前のもので、使用すれば安価になります(COMは、相互運用にまだ使用されているにもかかわらず、Microsoftの世界でも、もはや完全にホットではないため)。

COMが存在する主な理由は、コンポーネントベースの開発を容易にするためです。これは基本的に、コードをコンパイルするときにライブラリをリンクする代わりに、インターフェイス(外部コンポーネントとの通信方法の説明)を参照し、展開するとき。これは、Microsoft独自のテクノロジーのほとんどの基礎となっています。

システムは、すべてが管理される前にクールだったいくつかの機能をサポートしています(参照カウントや自己記述(IDispatchを使用)など)。


5

COMは90年代に作成された標準で、さまざまなソフトウェアが相互に通信できるようにします。最も重要なのは、1つのソフトウェアでオブジェクトを作成またはバインドし、そのインターフェイスを呼び出すことができるバイナリ標準です。これにより、ASPページ(COMオブジェクト)から呼び出すことができるC ++でDLLを作成したり、VBダイアログボックス(ActiveXコントロール)またはExcelワークシートに配置できるDelphiでコントロールを作成したりできます。画像をWordに貼り付けると、COMも使用され、別のアプリケーションがWordに埋め込まれます。DCOMはあまり一般的ではありませんが、DCOMはリモートオブジェクトを呼び出すためのもので、通常はこれを行う簡単な方法があります。

したがって、Com / ActiveX / DCOMは10年前にVB、VBA、C ++ / ATL、Delphiで非常に人気がありました。Dotnetははるかに単純ですが、C#はCOMやVBなどのほとんどの使用を置き換えました

それでも、ドットネットアプリケーションやJavaやC ++から呼び出したいCOMインターフェイスがたくさんあります。(あなたは言わないでください)

COMインターフェイスを呼び出す必要がある場合、これを行う最も簡単な方法はVBです。Dotnet 4.0では、C#に動的キーワードがあり、IDispatchインターフェイスの呼び出しがはるかに簡単になります。これは、おそらく注目すべき優れたソリューションです。

多くの詳細を知る必要がある場合、C ++およびATLを使用する必要があり、CoCreateInstanceなどのC APIを呼び出します。ただし、以前の技術として使用でき、あまり使用されていない場合は、上記の推奨事項に従ってください。

どの監視ソフトウェアを見ているのかわかりませんが、ドットネットのSystem.Managementクラスを介して利用できる可能性があります。


2

以下はCOMの概要の概要Mです:

最初のビデオでは、バイナリコンポーネントを作成して、異なる言語(言語に依存しない)で記述されたコードを再利用し、異なるマシン(プロセス)(場所に依存しない/透明)でコードを再利用するという一般的なアイデアについて説明します。一部のソフトウェア会社では、このテクノロジーを使用して、ソフトウェアを購入して自社に組み込んだり、システムにコードを最初から作成したりする代わりに、他のソフトウェア(企業)と統合します。

このテクノロジーには3つの異なるバージョン(実装)があります。

C ++開発者向けのOLE / COM / DCOM / ActiveX(ATLはプログラマの仕事を容易にするために使用されます)

Java開発者向けのJavaBeans / RMI / EJB

CORBA / IIOP

ソフトウェアをJavaで記述し、既にパッケージに存在する機能を追加したいときに便利なテクノロジーと考えてください。ただし、C ++で記述されており、あなたのローカルマシン。どのようにして "new"を呼び出し、オブジェクトを作成し、それらからメソッドを呼び出すのですか?

COMコーディングを行う人々を見た以下の本のいずれかが本棚にあります。

  • COMおよびATL 3.0への開発者向けワークショップ

  • Inside Com

  • エッセンシャルCOM

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.