Blog~2015-11-04IUnknownCOMCOMは、Microsoftが提唱した技術で、ある言語でできたライブラリなどのコンポーネントを別の言語から利用できるようにしたコンポーネントの仕様である・・・。WikipediaCOMは、コンポーネント本体とそれを別の言語から利用できるようにしたインターフェースで構成されていて、IUnknownインターフェースはそれらの基本となるもので、すべてのCOMコンポーネットに存在する・・・。プログラミング徹底解説IUnknownインターフェースだけを持つCOMのDLLライブラリを作ってみる・・・。[ツール]-[GUIDの生成]を選択し、COMのインターフェース情報について定義するIDLファイルに必要なGUIDを生成する・・・。GUID]を押すだけでぽんぽんできる・・・。[Copy]でクリップボードにコピーされるので、貼りつける時に便利・・・。インターフェース、タイプライブラリ、coclassの分が必要で今回とりあえず3つはメモしておく・・・。次に、今回はIUnknown_というインターフェースを持つクラスライブラリを作るので、IUnknown_.idlというファイルを用意して、こんなふうに書く・・・。uuidの後の、"("と")"の間に先程生成したGUIDをそれぞれ別々にあてはめる・・・。IUnknownインターフェースを継承した、IUnknown_インターフェース・・・。それを持つcoclassであるCUnknownクラス・・・。それを持つUnknownLibタイプライブラリ・・・。(難しいけど、こういうものだと思うしかない・・・。8\VC\PlatformSDK\include\oaidl.acfoaidl.acfC:\Project\Cloud\github.com\Sample\com\IUnknown\IUnknown\src>MIDLコンパイラにより、ファイルが生成される・・・。ここでようやくIUnknownプロジェクトを作成する・・・。してもいいけど、IUnknown_.idlだけ追加しておく・・・。(実は、idlを追加しておけば、ビルド時にVisualStudioが勝手にMIDLコンパイルしてくれる・・・。)CUnknownクラスの宣言をUnknown.hに書く・・・。STDMETHODIMPは標準的なCOMメソッドであることを表し、STDMETHODIMPマクロを付けているメソッドは、戻り値がHRESULT型になる・・・。STDMETHODIMP_(ULONG)は戻り値がULONGになる・・・。QueryInterface、AddRef、Releaseは、IUnknownにあるメソッドで、今回はそれらをオーバーライドしてる・・・。定義は、Unknown.cppに、m_lRefは、参照カウンタというもので、ここではコンストラクタで1にしてる・・・。COMは参照カウンタでオブジェクトのリソースを管理してる・・・。COM研究室QueryInterfaceはriidで指定されたインターフェースがあるかを探し、あればS_OKを返す・・・。riid)){ちゃんとした正式なCOMインターフェースにはIClassFactoryインターフェースが必要だが、今回は本当にIUnknownだけで作るので細工してる・・・。ppvに見つかったインターフェースのアドレスを渡してる・・・。"QueryInterface!"を出力してここが呼ばれたことがわかるようにしている・・・。(COM)インターフェースの参照開始を意味し、参照カウンタを増やす・・・。(COM)インターフェースの参照終了ということで、参照カウンタを減らす・・・。参照カウンタが0になると、このオブジェクトは解放される・・・。Methodは、IUnknownにはない、IUnknown_オリジナルのメソッド・・・。"Method!"を出力するだけだが、実際にCOMライブラリを作る時はこのようなメソッドを作っていろいろな処理ができるようにする・・・。次に、このクラスをDLL化するためにDllMain.cppを追加する・・・。COMDLLはタイプライブラリのGUIDをレジストリに登録をする必要があるので、DllRegisterServerで登録、DllUnregisterServerで削除・・・。DllGetClassObjectの中でCUnknownの持つインターフェース(IUnknown_など)を取得するようになっているのだが、IClassFactoryインターフェースで取得を前提としてるので、ここも細工してる・・・。これらのDLL関数を外部参照できるようにエクスポートする・・・。そのためにIUnknown.defというファイルを追加する・・・。これで、構成の種類を"ダイナミックライブラリ(.dll)"にして、DLL側は終わり・・・。あとは、Mainプロジェクトを追加して、Main.cppに、と書く・・・。blogCoGetClassObjectでIUnknown_を呼び出して、Methodを呼んでみる・・・。Mainで[追加のインクルードディレクトリ]に"../IUnknown"を追加・・・。一斉にリビルドするたび、MIDLコンパイラが走り、ファイルが更新されるので、IUnknown__h.hで↑が出たり、IUnknown__h.h自体がみつからないといったことが起こるが、一気にではなく、IUnknownを"ビルド"してからMainを"ビルド"する・・・。.何度か呼ばれてしまうのは、IClassFactoryが無いために小細工したからというのもある・・・。正しい作り方ではない・・・。IUnknownだけのIUnknown_でもいちおうMethodを呼ぶことはできた・・・。(27)はてなブログをはじめよう!BG1さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。