「[[マイクロソフト系技術情報 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をベースに、COMコンポーネント、ActiveXコントロールなどの部品が作られてきた。 -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>#v08f341f]] の例です。~ [[ProgID>#v08f341f]] は、 レジストリの HKEY_CLASSES_ROOT に書かれています。 **インターフェイス [#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>#v08f341f]] -GUID --[[CLSID>#s6a2699e]] --[[IID>#pa29af68]] の3種類の情報があります。 -レジストリで、[[ProgID>#v08f341f]] をたどると、サブキーに GUID がある場合があります。 -その場合は、 さらにその GUID キーをたどると、 COM部品の情報があります。 ***COM部品の実体 [#a2875ecc] COM部品の実体は、レジストリの GUID の下、 -InprocServer32 の値を確認すると、どのdllファイルが提供しているか分かります。 -InprocServer32 ではなく LocalServer32 の値に書かれている場合もあります。 ***InprocServer32、LocalServer32 [#y9b69c53] -InprocServer32に書かれている場合~ COM部品を呼び出したプロセスと同じプロセスの中で動作するCOM部品。~ -LocalServer32に書かれている場合~ COM部品を呼び出したのとは別のプロセス内で動作し、~ 呼び出し元とはプロセス間通信して動作するCOM部品。~ どちらも、COMですが、使用方法としては同じです。~ (デバッグやトラブルシュートでは、この違いは重要になってきますが)~ **[[DCOM>RPC#e49c6a83]] [#a06d9c01] *参考 [#m8e7b1d8] **内部リンク [#u6cad8e3] ***[[STA]] [#x91fb783] ***[[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開発]]