技術資料/COM
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
#contents
*全般 [#w690535f]
**なぜCOMが必要なのか [#jf7c4304]
COM通信は大きく分けて以下の3つが挙げられる。
+同一プロセス内でのCOM通信。DLL形式のCOMサーバを用いる。
+異なるプロセス間でのCOM通信。マーシャリングという仕組み...
+異なるマシン間でのCOM通信。ネットワークを介して通信され...
このうち、2番目と3番目の通信方法を実現するためにはCOMは有...
それでもCOM通信を用いる理由は、通常のDLLは使用する際に以...
-DLLを使用するアプリケーション側とDLL側で、関数の呼出規約...
しかし、言語によっては呼出規約を自由に決められない場合が...
-DLLを使用するアプリケーション側と、DLL側で、関数のマネー...
しかし、言語によっては.NETフレームワークを使用できず、マ...
**関連用語 [#hd1d02e4]
|呼称|説明|h
|COM&br;(Component Object Model)|アプリケーションの機能の...
|COMサーバ|決められたインタフェースでCOMクライアントに機...
|COMクライアント|COMサーバの提供する機能を利用するCOMコン...
|カスタムインタフェース|COMがアーリーバインディングでイン...
|ディスパッチインタフェース&br;(またはオートメーション)...
|デュアルインタフェース|カスタムインタフェースとディスパ...
|ATL&br;(Active Template Library)|COMオブジェクトの開発を...
|ActiveX|COMを利用した、自己登録可能なコントロールのこと...
|OLE&br;(Object Linking and Embedding)|オブジェクトの埋め...
|OCX&br;(OLE-based Control eXtension)|1つ以上のActiveXコ...
|UUID&br;(Universally Unique Identifier)|汎用一意識別子。...
|GUID&br;(Globally Unique Identifier)|グローバル一意識別...
|LIBID|ライブラリID。COMコンポーネントのライブラリを識別...
|CLSID|クラスID。COMコンポーネントのコクラスを識別するた...
|IID|インタフェースID。COMコンポーネントのインタフェース...
|IDL&br;(Interface Definition Language)|インタフェース記...
|参照カウント|COMコンポーネントが複数のクライアントから同...
|アパートメント|異なるプロセス/スレッド間であってもそれを...
|マーシャリング|異なるアパートメント間(つまり、異なるプ...
|接続ポイント||
**参考リンク [#sf5c05f3]
http://msdn.microsoft.com/ja-jp/vstudio/ffd7bcba-8a24-41c...
http://program.station.ez-net.jp/special/vc/atl-com/varia...
http://www.tomosan.org/dev/vs/activex.html~
http://www.ops.dti.ne.jp/~allergy/com/com.html~
http://atata.sakura.ne.jp/
**注意事項 [#hac3fa04]
-ATLによるCOMのレジストリ登録で、パスに2バイト文字が使わ...
**データ型 [#afc9b81b]
***Variant型 [#p2b290ee]
様々なデータ型を格納するために、保持するデータ型のIDと実...
#br
関連する関数等。
|種類|名称|処理|h
|関数|VariantInit()|Variant型変数の初期化|
|~|VariantClear()|Variant型変数のクリア|
|~|VariantCopy()|Variant型変数のコピー|
|~|VariantCopyInd()|???|
|~|VariantChangeType()|Variant型の保持するデータ型の変換|
|~|VariantChangeTypeEx()|???|
|変数型|VARTYPE|VARENUM列挙体の値を格納してVariant型の種...
|構造体|VARIANT|Variant型を扱うための構造体|
|列挙体|VARENUM|保持できるデータ型の列挙体|
|MFC クラス|COleVariant|VARIANT構造体のラッパクラス|
|ATL クラス|CComVariant|VARIANT構造体のラッパクラス|
|その他 クラス|_variant_t|VARIANT構造体のラッパクラス|
CENTER:※...\VC98\Include\OAIDL.h(338) を参照。
#br
(C++からVARIANT型の変数を渡す場合)
+VARIANT型変数を、VariantInit()で初期化。
+VARIANT::vt に VARENUM列挙体 からデータ型を代入。
+データ型に合った共用体のメンバ変数に値を代入。
+値を渡す。
+VARIANT型変数を、VariantClear()でクリア。
(C++でVARIANT型の変数を受け取る場合)
+VARIANT型変数を、VariantInit()で初期化。
+値を受け取る。
+データ型に合った共用体のメンバ変数から直接値をコピーした...
***BSTR型 [#f1c23b08]
実体は wchar_t*型のUnicode文字列。ただし、通常の文字列と...
-先頭から前4バイト分が文字数を表す。
-文字列中にNULL文字を埋め込むことができる。逆にいえば、NU...
#br
関連する関数等。
|種類|名称|処理|h
|関数|SysAllocString()|引数で指定した文字数のBSTRを作成す...
|~|SysFreeString()|引数で指定したBSTRを削除する|
|~|SysStringLen()|引数で指定したBSTRの文字数を返す|
|~|SysStringByteLen()|引数で指定したBSTRのバイト数を返す|
|~|SysAllocStringByteLen()|引数で指定した8ビット文字列を...
|~|SysAllocStringLen()|引数で指定した16ビット文字列を指定...
|MFC|CString::AllocSysString|格納されている文字列を元にBS...
|ATL クラス|CComBSTR|文字数を表す4バイトのプリフィックス...
|その他 クラス|_bstr_t|BSTR型のラッパクラス|
#br
メモリの扱いについて。[[→参考:http://msdn.microsoft.com/j...
-入力値(引数)にBSTR型を持つメソッド~
BSTRのメモリ確保、解放はクライアント(呼び出し)側が行う。
-出力値(引数、戻り値)にBSTR型を持つメソッド~
BSTRのメモリ確保はサーバ(メソッド実装)側が、解放はクライ...
BSTR型を扱うときは、メモリリークしないように注意する。~
以下は、_bstr_tクラスの扱いによるメモリリークの有無の例。
-メモリリークしない例
#code(c){{
BSTR bstr = NULL;
// COMのメソッドを呼び出す
m_pTestCom->GetString(&bstr);
// コンストラクタを使用して格納(第2引数をfalseにする...
_bstr_t bstrt(bstr, false);
// _bstr_tクラスのデストラクタで、bstrが解放される
}}
-メモリリークする例
#code(c){{
BSTR bstr = NULL;
_bstr_t bstrt;
// COMのメソッドを呼び出す
m_pTestCom->GetString(&bstr);
// =演算子を使用する(bstrのコピーが格納される)
bstrt = bstr;
// _bstr_tクラスのデストラクタではコピーした文字列の...
// 元のbstrは解放されないまま残ってしまう
}}
***配列型 [#e61e4b93]
次元数や要素数と、データを指すポインタを持つ構造体。
#br
関連する関数等。
|種類|名称|処理|h
|構造体|SAFEARRAY|COMの配列型を管理する構造体|
|MFC クラス|COleSafeArray|VARIANT構造体のラッパクラス|
|ATL クラス|CComSafeArray|VARIANT構造体のラッパクラス&br;...
***HRESULT型 [#x9aebd91]
***VARIANT_BOOL型 [#bde444ec]
COMで使用する真理値型。C言語で使用するBOOL型やbool型とは...
-真(VARIANT_TRUE) : -1
-偽(VARIANT_FALSE) : 0
**スマートポインタ [#pa41ecc1]
COMオブジェクトは使い終わったら必ず解放しなければならない...
#br
関連する関数等。
|種類|名称|処理|h
|ATL クラス|CComPtr<T>|スマートポインタを実現するためのCO...
|その他 クラス|_com_ptr_t<T>|スマートポインタを実現するた...
#br
***オブジェクトの生成 [#vcc65d6c]
~CComPtr<T> はテンプレートクラスとして定義されているため...
#code(c){{
CComPtr<ISampleObject> pSampleObj;
}}
実際の生成には、CComPtr<T>::CoCreateInstance() を用いる。
***オブジェクトの代入 [#j786cdf2]
~CComPtr<T>型の変数を定義し、既に生成済みのCOMオブジェク...
代入には、基底クラスのCComPtrBase<T>::Attach() を用いる
#code(c){{
// pIFooObj はスマートポインタではなく、ISampleObject...
pISampleObj = pIFooObj; // ×
pISampleObj.Attach(pIFooObj); // ○
}}
また、CComPtr<T>オブジェクトとして生成済みのCOMオブジェク...
***オブジェクトの関数の呼び出し [#ye16db42]
~オーバロードされた演算子「->」を用いる。つまり、スマート...
#code(c){{
// 通常のCOMオブジェクトのように使用できる
pISampleObj->Func();
}}
***オブジェクトの解放 [#na570065]
~何もする必要はない。デストラクタで解放を行ってくれるため...
もし明示的にCOMオブジェクトの解放を行う場合は、内部のオブ...
#code(c){{
pISampleObj->Release(); // ×
pISampleObj.Release(); // ○
}}
また、スコープを抜けるときに自動的に解放されたくない場合...
**COM識別子(GUID) [#j4539fc7]
COMサーバを識別するために、GUIDという128ビットの値を用い...
GUIDは5グループの16進文字列で表わされる。それぞれ、8, 4, ...
#code(c){{
// GUIDの例
AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE
// GUID構造体
GUID::Data1 (DWORD) // AAAAAAAA
GUID::Data2 (WORD) // BBBB
GUID::Data3 (WORD) // CCCC
GUID::Data4[8] (BYTE) // DDDD-EEEEEEEEEEEE
}}
#br
***ProgID [#vff00ef2]
COMサーバを識別するための文字列。VB系言語で CreateObject(...
***CLSID [#x5c182cc]
COMクラスの識別子で、GUIDで表わされる。~
GUID型にtypedefされている。また、「REFCLSID」という識別子...
***IID [#x9700a63]
COMクラス内のインタフェースの識別子で、GUIDで表わされる。~
GUID型にtypedefされている。また、「REFIID」という識別子が...
***その他 [#m2b3247a]
-FMTID
~プロパティセットフォーマットの識別子で、GUIDで表わされる...
-CATID
~コンポーネントカテゴリの識別子で、GUIDで表わされる。(typ...
**インタフェース定義ファイルの生成の流れ [#ha252b6d]
サーバもクライアントも、使用するインタフェースの定義はIDL...
C++で実装を行う場合、インタフェースの定義をヘッダファイル...
以下にファイルの生成の流れを示す。~
&attachref(ref001.PNG);
#br
**デバッグのヒント [#q7733e40]
-atlbase.hをインクルードする前に_ATL_DEBUG_INTERFACESマク...
#code(cpp){{
// ATLの使用開始をウィザードで行った場合、stdafx.hでatlba...
#define _ATL_DEBUG_INTERFACES
#include <atlbase.h>
}}
**#importディレクティブのオプション [#zd716246]
|オプション|説明|h
|named_guids|このオプションを使用すると、LIBID,CLSID,IID,...
|raw_interfaces_only|デフォルトでは下記の動作。&br; ・非...
|raw_native_types|デフォルトでは下記の動作。&br; ・ラッ...
*COMクライアント [#rb2e6f71]
**COMコンポーネントをバインドする2種類の方法 [#y0b11de5]
アーリーバインディングとレイトバインディングの2種類の方法...
|>||アーリーバインディング|レイトバインディング|h
|>|別名|事前バインディング|実行時バインディング、遅延バイ...
|>|概要|必要なインタフェースのインスタンスを取得し、直接...
|>|COMコンポ―ネント側で実装する必要があるインタフェース|...
|>|処理速度|速い|遅い|
|>|COMコンポ―ネントの仕様変更時の影響|影響を受けにくい|影...
|各言語別の使用方法|C++|直接メソッド等をコールする&br;ラ...
|~|VB|参照設定で予めプロジェクトに取り込む&br;変数はその...
|~|C#|???|リフレクションを用いる?|
|~|Java|>|JAVA-COMブリッジという技術を用いる。JCOM等のツ...
**実装手順 [#rb33a044]
+COMの使用開始
~スレッド内でCOMを使う前に、::CoInitialize() をコールする。
+COMオブジェクトの定義、生成
+COMオブジェクトの使用
+COMオブジェクトの解放
+COMの使用終了
~スレッド内でCOMを使い終えたら、::CoUninitialize() をコー...
使用したインタフェースの解放時には参照カウントがデクリメ...
*COMサーバ(COMコンポーネント) [#b175d817]
**レジストリ登録 [#i9f78a3d]
COMコンポーネントは、レジストリに自分のパスとGUIDを登録し...
***DLL形式のCOMサーバ [#r2a8b7b3]
-登録
regsvr32 xxx.dll
-解除
regsvr32 /u xxx.dll
***EXE形式のCOMサーバ [#q98d6993]
-登録
xxx.exe /RegServer
-解除
xxx.exe /UnregServer
***タイプライブラリのバイナリへの埋め込み [#k00dee91]
VisualStudioでCOMサーバを作成すると、リソースにCLSIDをレ...
~tlbファイルは、レジストリ登録時にCOMサーバと同じ場所に置...
~リソースへtlbファイルを埋め込むには、rcファイルの「3 TEX...
3 TEXTINCLUDE DISCARDABLE
BEGIN
:
"#ifdef _DEBUG\r\n"
"1 TYPELIB ""Debug\\xxx.tlb""\r\n"
"#else\r\n"
"1 TYPELIB ""Release\\xxx.tlb""\r\n"
"#endif // _DEBUG\r\n"
"\0"
END
※tlbファイルは相対パスを指定する必要があるが、EXE形式のCO...
[[参考リンク1:http://eternalwindows.jp/com/comserver/coms...
[[参考リンク2:http://monado.dtiblog.com/blog-entry-52.htm...
***VBアプリケーションによる自動登録 [#td47448f]
VBで作成されたアプリケーションは、自身が参照するOCXがレジ...
**実装すべきインタフェース [#w4038ad1]
-IUnknownインタフェース
~全てのCOMコンポーネントは、IUnknownインタフェースを実装...
-IDispatchインタフェース
~デュアルインタフェースに対応する場合は、IDispatchインタ...
※IDispatchインタフェースは、IUnknownインタフェースを含む。
**実装すべき機能 [#m5369488]
レジストリへの自己登録機能など、必要な機能を実装する。
***DLL形式のCOMサーバ [#hb653368]
以下の4つの関数をエクスポートする必要がある。
-xxx
-xxx
-xxx
-xxx
***EXE形式のCOMサーバ [#s6d9e91f]
以下のコマンドラインオプションに対応する必要がある。
-/RegServer
-/UnRegServer
-/Embedding
-/Automation
*不具合/注意点 [#w7c943b6]
**COMサーバ(EXE形式)にウィザードによって追加されるコード ...
VC++6.0でウィザードによって追加されるコードが誤っている箇...
[[COMサーバ(EXE形式)にウィザードによって追加されるコード>...
**STAでの再入 [#wf165f0c]
COMサーバーをSTAにしておくことで、マルチスレッドで動作す...
(STAではシングルスレッドで動作させるために、COM呼び出し...
参考:http://blogs.wankuma.com/melt/archive/2007/12/13/11...
**SendMessage中のCOM呼び出し [#j6500c88]
SendMessageによって別スレッドから送信されたメッセージを処...
参考:http://support.microsoft.com/kb/131056/en-us
終了行:
#contents
*全般 [#w690535f]
**なぜCOMが必要なのか [#jf7c4304]
COM通信は大きく分けて以下の3つが挙げられる。
+同一プロセス内でのCOM通信。DLL形式のCOMサーバを用いる。
+異なるプロセス間でのCOM通信。マーシャリングという仕組み...
+異なるマシン間でのCOM通信。ネットワークを介して通信され...
このうち、2番目と3番目の通信方法を実現するためにはCOMは有...
それでもCOM通信を用いる理由は、通常のDLLは使用する際に以...
-DLLを使用するアプリケーション側とDLL側で、関数の呼出規約...
しかし、言語によっては呼出規約を自由に決められない場合が...
-DLLを使用するアプリケーション側と、DLL側で、関数のマネー...
しかし、言語によっては.NETフレームワークを使用できず、マ...
**関連用語 [#hd1d02e4]
|呼称|説明|h
|COM&br;(Component Object Model)|アプリケーションの機能の...
|COMサーバ|決められたインタフェースでCOMクライアントに機...
|COMクライアント|COMサーバの提供する機能を利用するCOMコン...
|カスタムインタフェース|COMがアーリーバインディングでイン...
|ディスパッチインタフェース&br;(またはオートメーション)...
|デュアルインタフェース|カスタムインタフェースとディスパ...
|ATL&br;(Active Template Library)|COMオブジェクトの開発を...
|ActiveX|COMを利用した、自己登録可能なコントロールのこと...
|OLE&br;(Object Linking and Embedding)|オブジェクトの埋め...
|OCX&br;(OLE-based Control eXtension)|1つ以上のActiveXコ...
|UUID&br;(Universally Unique Identifier)|汎用一意識別子。...
|GUID&br;(Globally Unique Identifier)|グローバル一意識別...
|LIBID|ライブラリID。COMコンポーネントのライブラリを識別...
|CLSID|クラスID。COMコンポーネントのコクラスを識別するた...
|IID|インタフェースID。COMコンポーネントのインタフェース...
|IDL&br;(Interface Definition Language)|インタフェース記...
|参照カウント|COMコンポーネントが複数のクライアントから同...
|アパートメント|異なるプロセス/スレッド間であってもそれを...
|マーシャリング|異なるアパートメント間(つまり、異なるプ...
|接続ポイント||
**参考リンク [#sf5c05f3]
http://msdn.microsoft.com/ja-jp/vstudio/ffd7bcba-8a24-41c...
http://program.station.ez-net.jp/special/vc/atl-com/varia...
http://www.tomosan.org/dev/vs/activex.html~
http://www.ops.dti.ne.jp/~allergy/com/com.html~
http://atata.sakura.ne.jp/
**注意事項 [#hac3fa04]
-ATLによるCOMのレジストリ登録で、パスに2バイト文字が使わ...
**データ型 [#afc9b81b]
***Variant型 [#p2b290ee]
様々なデータ型を格納するために、保持するデータ型のIDと実...
#br
関連する関数等。
|種類|名称|処理|h
|関数|VariantInit()|Variant型変数の初期化|
|~|VariantClear()|Variant型変数のクリア|
|~|VariantCopy()|Variant型変数のコピー|
|~|VariantCopyInd()|???|
|~|VariantChangeType()|Variant型の保持するデータ型の変換|
|~|VariantChangeTypeEx()|???|
|変数型|VARTYPE|VARENUM列挙体の値を格納してVariant型の種...
|構造体|VARIANT|Variant型を扱うための構造体|
|列挙体|VARENUM|保持できるデータ型の列挙体|
|MFC クラス|COleVariant|VARIANT構造体のラッパクラス|
|ATL クラス|CComVariant|VARIANT構造体のラッパクラス|
|その他 クラス|_variant_t|VARIANT構造体のラッパクラス|
CENTER:※...\VC98\Include\OAIDL.h(338) を参照。
#br
(C++からVARIANT型の変数を渡す場合)
+VARIANT型変数を、VariantInit()で初期化。
+VARIANT::vt に VARENUM列挙体 からデータ型を代入。
+データ型に合った共用体のメンバ変数に値を代入。
+値を渡す。
+VARIANT型変数を、VariantClear()でクリア。
(C++でVARIANT型の変数を受け取る場合)
+VARIANT型変数を、VariantInit()で初期化。
+値を受け取る。
+データ型に合った共用体のメンバ変数から直接値をコピーした...
***BSTR型 [#f1c23b08]
実体は wchar_t*型のUnicode文字列。ただし、通常の文字列と...
-先頭から前4バイト分が文字数を表す。
-文字列中にNULL文字を埋め込むことができる。逆にいえば、NU...
#br
関連する関数等。
|種類|名称|処理|h
|関数|SysAllocString()|引数で指定した文字数のBSTRを作成す...
|~|SysFreeString()|引数で指定したBSTRを削除する|
|~|SysStringLen()|引数で指定したBSTRの文字数を返す|
|~|SysStringByteLen()|引数で指定したBSTRのバイト数を返す|
|~|SysAllocStringByteLen()|引数で指定した8ビット文字列を...
|~|SysAllocStringLen()|引数で指定した16ビット文字列を指定...
|MFC|CString::AllocSysString|格納されている文字列を元にBS...
|ATL クラス|CComBSTR|文字数を表す4バイトのプリフィックス...
|その他 クラス|_bstr_t|BSTR型のラッパクラス|
#br
メモリの扱いについて。[[→参考:http://msdn.microsoft.com/j...
-入力値(引数)にBSTR型を持つメソッド~
BSTRのメモリ確保、解放はクライアント(呼び出し)側が行う。
-出力値(引数、戻り値)にBSTR型を持つメソッド~
BSTRのメモリ確保はサーバ(メソッド実装)側が、解放はクライ...
BSTR型を扱うときは、メモリリークしないように注意する。~
以下は、_bstr_tクラスの扱いによるメモリリークの有無の例。
-メモリリークしない例
#code(c){{
BSTR bstr = NULL;
// COMのメソッドを呼び出す
m_pTestCom->GetString(&bstr);
// コンストラクタを使用して格納(第2引数をfalseにする...
_bstr_t bstrt(bstr, false);
// _bstr_tクラスのデストラクタで、bstrが解放される
}}
-メモリリークする例
#code(c){{
BSTR bstr = NULL;
_bstr_t bstrt;
// COMのメソッドを呼び出す
m_pTestCom->GetString(&bstr);
// =演算子を使用する(bstrのコピーが格納される)
bstrt = bstr;
// _bstr_tクラスのデストラクタではコピーした文字列の...
// 元のbstrは解放されないまま残ってしまう
}}
***配列型 [#e61e4b93]
次元数や要素数と、データを指すポインタを持つ構造体。
#br
関連する関数等。
|種類|名称|処理|h
|構造体|SAFEARRAY|COMの配列型を管理する構造体|
|MFC クラス|COleSafeArray|VARIANT構造体のラッパクラス|
|ATL クラス|CComSafeArray|VARIANT構造体のラッパクラス&br;...
***HRESULT型 [#x9aebd91]
***VARIANT_BOOL型 [#bde444ec]
COMで使用する真理値型。C言語で使用するBOOL型やbool型とは...
-真(VARIANT_TRUE) : -1
-偽(VARIANT_FALSE) : 0
**スマートポインタ [#pa41ecc1]
COMオブジェクトは使い終わったら必ず解放しなければならない...
#br
関連する関数等。
|種類|名称|処理|h
|ATL クラス|CComPtr<T>|スマートポインタを実現するためのCO...
|その他 クラス|_com_ptr_t<T>|スマートポインタを実現するた...
#br
***オブジェクトの生成 [#vcc65d6c]
~CComPtr<T> はテンプレートクラスとして定義されているため...
#code(c){{
CComPtr<ISampleObject> pSampleObj;
}}
実際の生成には、CComPtr<T>::CoCreateInstance() を用いる。
***オブジェクトの代入 [#j786cdf2]
~CComPtr<T>型の変数を定義し、既に生成済みのCOMオブジェク...
代入には、基底クラスのCComPtrBase<T>::Attach() を用いる
#code(c){{
// pIFooObj はスマートポインタではなく、ISampleObject...
pISampleObj = pIFooObj; // ×
pISampleObj.Attach(pIFooObj); // ○
}}
また、CComPtr<T>オブジェクトとして生成済みのCOMオブジェク...
***オブジェクトの関数の呼び出し [#ye16db42]
~オーバロードされた演算子「->」を用いる。つまり、スマート...
#code(c){{
// 通常のCOMオブジェクトのように使用できる
pISampleObj->Func();
}}
***オブジェクトの解放 [#na570065]
~何もする必要はない。デストラクタで解放を行ってくれるため...
もし明示的にCOMオブジェクトの解放を行う場合は、内部のオブ...
#code(c){{
pISampleObj->Release(); // ×
pISampleObj.Release(); // ○
}}
また、スコープを抜けるときに自動的に解放されたくない場合...
**COM識別子(GUID) [#j4539fc7]
COMサーバを識別するために、GUIDという128ビットの値を用い...
GUIDは5グループの16進文字列で表わされる。それぞれ、8, 4, ...
#code(c){{
// GUIDの例
AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE
// GUID構造体
GUID::Data1 (DWORD) // AAAAAAAA
GUID::Data2 (WORD) // BBBB
GUID::Data3 (WORD) // CCCC
GUID::Data4[8] (BYTE) // DDDD-EEEEEEEEEEEE
}}
#br
***ProgID [#vff00ef2]
COMサーバを識別するための文字列。VB系言語で CreateObject(...
***CLSID [#x5c182cc]
COMクラスの識別子で、GUIDで表わされる。~
GUID型にtypedefされている。また、「REFCLSID」という識別子...
***IID [#x9700a63]
COMクラス内のインタフェースの識別子で、GUIDで表わされる。~
GUID型にtypedefされている。また、「REFIID」という識別子が...
***その他 [#m2b3247a]
-FMTID
~プロパティセットフォーマットの識別子で、GUIDで表わされる...
-CATID
~コンポーネントカテゴリの識別子で、GUIDで表わされる。(typ...
**インタフェース定義ファイルの生成の流れ [#ha252b6d]
サーバもクライアントも、使用するインタフェースの定義はIDL...
C++で実装を行う場合、インタフェースの定義をヘッダファイル...
以下にファイルの生成の流れを示す。~
&attachref(ref001.PNG);
#br
**デバッグのヒント [#q7733e40]
-atlbase.hをインクルードする前に_ATL_DEBUG_INTERFACESマク...
#code(cpp){{
// ATLの使用開始をウィザードで行った場合、stdafx.hでatlba...
#define _ATL_DEBUG_INTERFACES
#include <atlbase.h>
}}
**#importディレクティブのオプション [#zd716246]
|オプション|説明|h
|named_guids|このオプションを使用すると、LIBID,CLSID,IID,...
|raw_interfaces_only|デフォルトでは下記の動作。&br; ・非...
|raw_native_types|デフォルトでは下記の動作。&br; ・ラッ...
*COMクライアント [#rb2e6f71]
**COMコンポーネントをバインドする2種類の方法 [#y0b11de5]
アーリーバインディングとレイトバインディングの2種類の方法...
|>||アーリーバインディング|レイトバインディング|h
|>|別名|事前バインディング|実行時バインディング、遅延バイ...
|>|概要|必要なインタフェースのインスタンスを取得し、直接...
|>|COMコンポ―ネント側で実装する必要があるインタフェース|...
|>|処理速度|速い|遅い|
|>|COMコンポ―ネントの仕様変更時の影響|影響を受けにくい|影...
|各言語別の使用方法|C++|直接メソッド等をコールする&br;ラ...
|~|VB|参照設定で予めプロジェクトに取り込む&br;変数はその...
|~|C#|???|リフレクションを用いる?|
|~|Java|>|JAVA-COMブリッジという技術を用いる。JCOM等のツ...
**実装手順 [#rb33a044]
+COMの使用開始
~スレッド内でCOMを使う前に、::CoInitialize() をコールする。
+COMオブジェクトの定義、生成
+COMオブジェクトの使用
+COMオブジェクトの解放
+COMの使用終了
~スレッド内でCOMを使い終えたら、::CoUninitialize() をコー...
使用したインタフェースの解放時には参照カウントがデクリメ...
*COMサーバ(COMコンポーネント) [#b175d817]
**レジストリ登録 [#i9f78a3d]
COMコンポーネントは、レジストリに自分のパスとGUIDを登録し...
***DLL形式のCOMサーバ [#r2a8b7b3]
-登録
regsvr32 xxx.dll
-解除
regsvr32 /u xxx.dll
***EXE形式のCOMサーバ [#q98d6993]
-登録
xxx.exe /RegServer
-解除
xxx.exe /UnregServer
***タイプライブラリのバイナリへの埋め込み [#k00dee91]
VisualStudioでCOMサーバを作成すると、リソースにCLSIDをレ...
~tlbファイルは、レジストリ登録時にCOMサーバと同じ場所に置...
~リソースへtlbファイルを埋め込むには、rcファイルの「3 TEX...
3 TEXTINCLUDE DISCARDABLE
BEGIN
:
"#ifdef _DEBUG\r\n"
"1 TYPELIB ""Debug\\xxx.tlb""\r\n"
"#else\r\n"
"1 TYPELIB ""Release\\xxx.tlb""\r\n"
"#endif // _DEBUG\r\n"
"\0"
END
※tlbファイルは相対パスを指定する必要があるが、EXE形式のCO...
[[参考リンク1:http://eternalwindows.jp/com/comserver/coms...
[[参考リンク2:http://monado.dtiblog.com/blog-entry-52.htm...
***VBアプリケーションによる自動登録 [#td47448f]
VBで作成されたアプリケーションは、自身が参照するOCXがレジ...
**実装すべきインタフェース [#w4038ad1]
-IUnknownインタフェース
~全てのCOMコンポーネントは、IUnknownインタフェースを実装...
-IDispatchインタフェース
~デュアルインタフェースに対応する場合は、IDispatchインタ...
※IDispatchインタフェースは、IUnknownインタフェースを含む。
**実装すべき機能 [#m5369488]
レジストリへの自己登録機能など、必要な機能を実装する。
***DLL形式のCOMサーバ [#hb653368]
以下の4つの関数をエクスポートする必要がある。
-xxx
-xxx
-xxx
-xxx
***EXE形式のCOMサーバ [#s6d9e91f]
以下のコマンドラインオプションに対応する必要がある。
-/RegServer
-/UnRegServer
-/Embedding
-/Automation
*不具合/注意点 [#w7c943b6]
**COMサーバ(EXE形式)にウィザードによって追加されるコード ...
VC++6.0でウィザードによって追加されるコードが誤っている箇...
[[COMサーバ(EXE形式)にウィザードによって追加されるコード>...
**STAでの再入 [#wf165f0c]
COMサーバーをSTAにしておくことで、マルチスレッドで動作す...
(STAではシングルスレッドで動作させるために、COM呼び出し...
参考:http://blogs.wankuma.com/melt/archive/2007/12/13/11...
**SendMessage中のCOM呼び出し [#j6500c88]
SendMessageによって別スレッドから送信されたメッセージを処...
参考:http://support.microsoft.com/kb/131056/en-us
ページ名: