27

一生懸命探しましたが、全体像をつかむことができませんでした。誰でも教えてもらえますか:

  • COMとは実際には何ですか?
  • GUID はどのように機能し、COM でどのように使用されますか?
  • COM はさまざまな DLL バージョンの問題をどのように解決しますか。

または、少なくとも、これらの概念を説明している優れた記事を教えてください。ありがとう!

4

7 に答える 7

21

COM は「コンポーネント オブジェクト モデル」です。これは、コンポーネントの「バイナリ再利用」を可能にするように設計された最初のテクノロジの 1 つです。もともとは、1988 年から 1992 年にかけての Microsoft Office で Dynamic Data Exchange (DDE) と呼ばれていたものを書き直したものでした。さまざまな Office アプリケーションが相互に通信できるように設計されたテクノロジです。それを書き換える最初の試みは、OLE-Automation (Object Linking and Embedding) と呼ばれました。しかし、彼らがやり遂げたとき、彼らはそれをCOMに名前を変更しました。

使い方:

基本的に、COM 以前は、クライアント コンポーネントが (C++ ライブラリとして記述された) コンポーネントを使用する必要がある場合、ライブラリを使用してコンパイルする必要があったため、各メソッドまたは関数を見つけるために、コンパイルされたバイナリ ファイルに含まれる正確なバイト数を知ることができました。電話。

COM では、これらのメソッドがどのように構造化されるかについて定義されたメカニズムがあり、コンパイラは、このすべての関数オフセット データを含む別のファイル (タイプ ライブラリまたはインターフェイス定義言語 (IDL) ファイルと呼ばれる) を生成します。

次に、コンポーネントのユーザーとして、コンポーネントを「登録」する必要があります。これにより、このすべての情報 (GUID のキーオフ) が OS レジストリに書き込まれ、すべてのクライアント アプリがアクセスできるようになり、レジストリからデータが読み取られます。各メソッドまたはクラスのエントリ ポイントがバイナリ ファイル内のどこにあるかを知ることができます。

于 2009-04-14T16:45:14.020 に答える
13

ここで完全な説明をするには、質問が少し大きくなります。COM の概要については、書籍『Understanding ActiveX and OL E』を参照してください。より詳細でありながら入門的な紹介として、Inside COMがあります。このテーマに関する最高の本は、Don Box のEssential COMです。

いくつかの簡単な答え:

  • COM は、オブジェクトのバイナリ インターフェイス標準です。これにより、さまざまなプログラムが、同じコンパイラを使用して同じ言語で書かれている必要なく、インターフェイスに書き込むことができます。関連サービスもご用意しております。
  • GUID は、インターフェイスを識別するために COM が使用するグローバルに一意の番号です。
  • COM は、異なる DLL バージョンの問題を解決しません。各 GUID に登録できる DLL は 1 つだけです。
于 2009-04-14T16:44:13.960 に答える
6

COM は、再利用可能なソフトウェアを有効にします。ビルディング ブロックと同様に、COM オブジェクト (現在は .NET のアセンブリ) を作成して、より大きなソフトウェアに機能を提供できます。COM を使用して、Excel と MS BizTalk の DB 統合を提供しました。MS BizTalk などのソフトウェアは、COM/Assemblies を使用して標準プロセスの処理機能を拡張します。COM をメッセージ ワークフローに挿入して、Microsoft によって実装されているよりも多くの処理を行うことができます。COM では、組み込みのオブジェクト プーリング、セキュリティ、および制御インターフェイスを提供するコンポーネント サービスも使用できます。

ウィキペディアにはGUIDの適切な定義があります。Microsoft には、他の開発コミュニティでは必ずしも使用されていない形式があることに注意してください。

COM 自体は、DLL のバージョンの問題を解決しません。COM バージョン管理機能を使用すると、ソフトウェアを段階的に拡張できます。そのため、COM を使用して XML をテキストに変換するアプリケーション (たとえば) を拡張したい場合は、新しいバージョン (2.0) を作成し、ソース アプリケーションを更新して、新しいコム。このようにして、(必要に応じて) システムの制限によって必要な場合は古い COM を引き続き使用できる switch ステートメントを使用するか、新しい COM を使用することができます (それらは異なる DLL になります)。

于 2009-04-14T17:03:22.510 に答える
5

COMにはさまざまなものがあります。Don Box の本、Essential COM を学習する良い方法としてお勧めします。

最低限、COM オブジェクトは、単一のインターフェイス IUnknown を公開するオブジェクトです。このインターフェイスには、AddRef、Release、および QueryInterface の 3 つのメソッドがあります。AddRef/Release を使用すると、オブジェクトを参照カウントできるようになり、最後の参照が解放されると自動的に削除されます。QueryInterface を使用すると、オブジェクトがサポートする他のインターフェイスについてオブジェクトに問い合わせることができます。

ほとんどの COM オブジェクトは検出可能です。これらは、CLSID (クラス ID) と呼ばれる識別 GUID を使用して HKEY_CLASSES_ROOT の下のレジストリに登録されます。これにより、GUID がわかっている場合は、CoCreateInstance を呼び出して登録済みオブジェクトのインスタンスを作成できます。オブジェクトを識別する文字列である ProgId (プログラム ID) をサポートする CLSID について、COM API を介してレジストリにクエリを実行することもできます。

多くの COM オブジェクトには、オブジェクトがサポートするインターフェイスとメソッドを指定するタイプ ライブラリと、オブジェクトのメソッドを動的に呼び出すことができるメソッド Invoke を持つ IDispatch があります。これにより、厳密な型指定をサポートしていないスクリプト言語からオブジェクトを使用できるようになります。

一部のオブジェクトは、別のプロセス、別のスレッド、または別のマシンでの実行をサポートしています。COM は、これらの種類のオブジェクトのマーシャリングをサポートしています。可能であれば、標準マーシャラーはオブジェクトの typelib を使用してオブジェクトへの呼び出しをマーシャリングできますが、カスタム マーシャラーも提供できます。

COM オブジェクトにはまだまだたくさんの機能があります。

于 2009-04-14T16:56:39.967 に答える
0

COMは Microsoft の Component Object Model であり、さまざまな言語で記述されたプログラムが相互運用するためのバイナリ互換インターフェイスです。これは、OLE テクノロジと .NET テクノロジの間の "進化の一歩" です。

COM について C++ の観点から学びたい場合は、Don Box のEssential COM、またはRector と Sells によるATL Internalsをご覧ください。

グループmicrosoft.public.vc.atlは、ここで回答を得られない質問をするのにおそらく最適な場所です。これは主に ATL ニュースグループですが、一般的な COM の質問に対するトラフィックも最も多いニュースグループのようです。(いつものニュースグループの無愛想さと焦りに備えてください)

于 2009-04-14T16:44:27.283 に答える
0

COM は、アプリケーション、OS、およびその他のコンポーネントにサービスを提供するソフトウェア コンポーネント (小さなバイナリ exe) を開発する方法です。カスタム COM コンポーネントの開発は、オブジェクト指向 API の開発に似ています。GUID はグローバル固有 ID であり、COM コンポーネントを一意に識別するために使用されます。

詳細については、Dale Rogerson による非常に優れた本を参照してください。COMの内部

于 2009-04-14T16:47:38.397 に答える