「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>コンポーネント技術]]

* 目次 [#l9568f70]
#contents

* 概要 [#m4ffc982]
COM(Component Object Model) は、Microsoft が作り出した、プログラムや部品の呼び出しを共通的に行える仕組みです。~
COMをベースに、 コントロール、ActiveX などの部品も作られてきました。
-COM(Component Object Model) は、

COMに関しては、下のページも参考ください。~
[[Component Object Model - wikipedia:http://ja.wikipedia.org/wiki/Component_Object_Model]]
--Microsoft が作り出した、プログラムや部品の呼び出しを共通的に行える仕組み。
--COMをベースに、COMコンポーネント、ActiveXコントロールなどの部品が作られてきた。

*利用 [#afbe7fe1]
COMを利用する際は、ProgID を使用して、COM部品のオブジェクトを得ます。
-COMに関しては、下のページも参考ください。~

--[[Component Object Model - wikipedia:http://ja.wikipedia.org/wiki/Component_Object_Model]]

*詳細 [#y4817997]

**利用 [#afbe7fe1]
COMを利用する際は、[[ProgID>#v08f341f]] を使用して、COM部品のオブジェクトを得ます。

-vbsの例 (作成する場合)~
  set fso = CreateObject("Scripting.FileSystemObject")
-vbsの例 (作成済みのオブジェクトを取得する場合)~
  set word = GetObject("c:\temp\word.doc", "Word.Document")

Scripting.FileSystemObject や "Word.Document" は ProgID の例です。~
ProgID は、 レジストリの HKEY_CLASSES_ROOT に書かれています。
Scripting.FileSystemObject や "Word.Document" は [[ProgID>#v08f341f]] の例です。~
[[ProgID>#v08f341f]] は、 レジストリの HKEY_CLASSES_ROOT に書かれています。

*レジストリ [#w63423fa]
**インターフェイス [#o4aa92ff]

***プロジェクト互換 [#nd6660ca]
-インターフェイス変更が認められている。
-インターフェイスが変更されると [[CLSID>#s6a2699e]], [[IID>#pa29af68]] などのIDも変更される。

***バイナリ互換 [#p1d7c242]
-インターフェイス変更はメソッド追加だけが認められている。
-仮想関数メカニズムを利用し、継承したインターフェイスにメソッドを追加する。
-このため、既存の[[CLSID>#s6a2699e]], [[IID>#pa29af68]]は変更されず、新しいインターフェイスの[[IID>#pa29af68]]ダケが追加される。

**ID [#p6abd0f7]

***プログラムID(ProgID) [#v08f341f]
-プロジェクト名.クラス名
-前述のCreateObjectの引数に使用される。

***クラスID(CLSID) [#s6a2699e]
-GUID
-COMオブジェクトを識別する
-CoCreateInstanceの引数として渡される。

***インターフェイスID(IID) [#pa29af68]
-GUID
-インターフェイスを識別する
-CoCreateInstanceや、QueryInterfaceの引数として渡される。

**レジストリ [#w63423fa]

HKEY_CLASSES_ROOT には、大きく分けて、
-拡張子
-ProgID
-[[ProgID>#v08f341f]]
-GUID
--[[CLSID>#s6a2699e]]
--[[IID>#pa29af68]]

の3種類の情報があります。

-レジストリで、ProgID をたどると、サブキーに GUID がある場合があります。
-レジストリで、[[ProgID>#v08f341f]] をたどると、サブキーに GUID がある場合があります。
-その場合は、 さらにその GUID キーをたどると、 COM部品の情報があります。

**COM部品の実体 [#a2875ecc]
***COM部品の実体 [#a2875ecc]
COM部品の実体は、レジストリの GUID の下、 
-InprocServer32 の値を確認すると、どのdllファイルが提供しているか分かります。
-COM部品の実体が、InprocServer32 ではなく LocalServer32 の値に書かれている場合もあります。
-InprocServer32 ではなく LocalServer32 の値に書かれている場合もあります。

**InprocServer32、LocalServer32 [#y9b69c53]
***InprocServer32、LocalServer32 [#y9b69c53]

-InprocServer32に書かれている場合~
COM部品を呼び出したプロセスと同じプロセスの中で動作するCOM部品。~

-LocalServer32に書かれている場合~
COM部品を呼び出したのとは別のプロセス内で動作し、~
呼び出し元とはプロセス間通信して動作するCOM部品。~

どちらも、COMですが、使用方法としては同じです。~
(デバッグやトラブルシュートでは、この違いは重要になってきますが)~

*[[DCOM>RPC#e49c6a83]] [#a06d9c01]
**[[DCOM>RPC#e49c6a83]] [#a06d9c01]

*参考 [#m8e7b1d8]
-[[STA]]
-[[COMのメモリ・リーク]]
-[[DLL/COMユーザ]]

**内部リンク [#u6cad8e3]

***[[STA]]と[[MTA]] [#x91fb783]
***[[DLL/COMユーザ]] [#k62930ad]
***[[COMのメモリ・リーク]] [#k348b0b4]

**EternalWindows [#ac66347f]
-COM~
http://eternalwindows.jp/index.html#com

**kekyoの丼 [#bde10500]
-COM~
http://www.kekyo.net/category/com
--COMのアパートメント
---(1) スレッド同期の隠蔽
---(2) コンポーネントファサード
---(3) スレッドの属性とコンポーネント
---(4) スレッド親和性
---(5) CoInitializeExは初期化ではない
---(6) アパートメントの種類はどのように決まるのか
---・・・
--・・・

**[連載! とことん VC++] COM 再入門 [#r7ca655c]
-第 1 回 ~ COM オブジェクトの基本的利用 (COM クライアントの実装) ~~
https://code.msdn.microsoft.com/windowsdesktop/VisualC-7c6bc862
-第 2 回 ~ COM オブジェクトの基本的実装 ~~
https://code.msdn.microsoft.com/windowsdesktop/VisualC-dbc36ad9

----
Tags: [[:Windows]], [[:.NET開発]]
Tags: [[:Windows]], [[:プログラミング]], [[:.NET開発]]


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS