2006 年 6 月 18 日 11 時 50 分

COM インタフェースと .NET


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


エクスプローラにカラムを追加するには、
シェルで定義されている COM 用のインタフェースである、
IColumnProvider を実装したクラスを公開する必要がある。

.NET は、新しい COM サーバを作成するには便利なのだが、
COM で定義されているインタフェースを利用する場合、
それらを使うために少し面倒な手順を踏む必要がある。

COM のインタフェースは、そのまま .NET で利用できない。
古い技術である COM は .NET のことを知らないからだ。
.NET で COM のインタフェースを利用するためには、
COM の定義を .NET 用に変換して読み込む必要がある。
それには、以下の二つの方法がある。

1. .NET 用の参照ライブラリを作成して参照する。
2. ソースコードにインタフェース定義を記述する。

前者の参照ライブラリを作るためには、
COM のタイプライブラリ(*.tlb, *.dll)が必要だ。

タイプライブラリがあれば、それを参照設定するだけで、
.NET に含まれるタイプライブラリインポータが、
.NET 用の参照アセンブリを自動生成し、
それを利用してプログラムから利用することができる。

タイプライブラリは、インタフェースやクラスの定義などの
メタ情報をまとめた COM のヘッダファイルであり、
.NET におけるリフレクションに近い役割を持つ。

Visual Basic で COM サーバ(ActiveX DLL)を作った場合、
タイプライブラリを DLL に含む形でビルドされる。
また、Visual Basic でタイプライブラリを参照設定すると、
プログラムから簡単に利用することができるようになる。

ただ、COM ではタイプライブラリの提供は必須ではない。
C++ などの言語では、タイプライブラリはあまり使わない。

基本的にシェルプログラミングは、
C++ 言語を想定しているようで、
シェルで定義しているインタフェースに関しては、
一般的にタイプライブラリは提供されていない。

なお、タイプライブラリは IDL という言語でソースを書き、
MIDL というコンパイラで作成することができる。

古いシェルのインターフェースは、
shobjidl.idl というファイルで定義されているので、
MIDL を使えばタイプライブラリを作成することができるが、
IColumnProvider は Windows 2000 で公開された、
新し目のインターフェースなので、IDL の定義がないのだ。

自分で IDL を書いてコンパイルという手順でもいいのだが、
これでは .NET だけで完結しない上に、
タイプライブラリの追加登録という余計な手順を踏むので、
システムに登録する項目が余分に増える。

今回は、「C# で」としているので、
外部のツールはなるべく利用しない方法でやりたい。
そうなると、後者の方法を使うことになりそうだ。

では明日は、C# のソースコード上で、
COM インタフェース IColumnProvider を定義してみよう。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.