記事で紹介したサンプル・プログラムをダウンロードできます
<Delphi0706.lzh>   <Delphi0706.zip>

 今回は,Webページ全体の画面キャプチャを撮るアプリケーション「ウェブキャップ」(以下,WC)を作成します(図1)。このアプリケーションの作成を通して,COM(Component Object Model)を利用した独自コンポーネントの作り方/使い方とインタフェースの概念を紹介します。

図1●Webページ全体の画面キャプチャを撮るアプリケーション「ウェブキャップ」。URLを入力して「表示」ボタンを押すと,Webページが表示される。「キャプチャ」ボタンを押すことで,Webページ全体のキャプチャ画像を保存できる
図1●Webページ全体の画面キャプチャを撮るアプリケーション「ウェブキャップ」。URLを入力して「表示」ボタンを押すと,Webページが表示される。「キャプチャ」ボタンを押すことで,Webページ全体のキャプチャ画像を保存できる

COMコンポーネントとして,様々な機能が提供されている

 COMは米Microsoftが提唱するコンポーネント技術の仕様です。プログラムを機能単位(コンポーネント・オブジェクト)で分けて,それらを組み合わせることでアプリケーションを作る方法(モデル)を規定しています。機能を提供する各々のモジュールを「COMコンポーネント」といいます。

 COMを用いると,特定の機能をコンポーネントとして提供できるため,アプリケーションを簡単にすばやく作成できるようになります。例えば,Microsoftが標準で提供しているCOMコンポーネントには,HTMLのレンダリングなどを行う「IWebBrowser」があります。この COMコンポーネントを用いると,Webブラウザを簡単に作成できます。実際に,MicrosoftのWebブラウザであるInternet Explorer(IE)は,IWebBrowserをベースに作成されています。SleipnirなどのIEベースのブラウザも,IWebBrowserを利用しています。

 ほかにもMicrosoftは,メディアプレーヤの機能を実現するCOMコンポーネントやOfficeを制御できるCOMコンポーネントを提供しています。また,米Adobe SystemsはFlash PlayerのCOMコンポーネントを提供しています。このように,多くの機能がCOMコンポーネントとして提供されています。

 COMコンポーネントは,何らかの機能を複数のアプリケーションに提供するのにうってつけです。ただ,こう書くと,前回(2007年5月号の連載第3回)の記事で紹介した DLLとの違いがわからなくなる人がいるかもしれません。DLLは「プログラムを提供する単位」であるのに対し,COMは「プログラムの機能の単位」です。COMはあくまで技術仕様であって,DLLのように実際にソフトウエアを配布する単位を表しているわけではありません。COMコンポーネントをDLL として配布することもよくあります。

ID付きのインタフェースがCOMコンポーネント

 ここで「IWebBrowser」という言葉の意味を考えてみましょう。IWebBrowserの「WebBrowser」はWebブラウザのことだな,とすぐわかりますね。では,先頭に付いている「I」とは一体何でしょう?

 前回の記事で,Delphi言語では,クラスの頭には「T」を,クラスで定義されている変数には「F」を付けるという慣習を紹介しました。同じように,IWebBrowserの「I」は,「インタフェース(Interface)」を示しています。インタフェースの名前にIを付けるのは,Delphi 言語の慣習というよりは,Windowsの慣習です。

 インタフェースは,「クラスとやり取りする際の決まりごと」を表すものです。「実装を持たないクラス」ととらえることもできます。

 文章で説明するよりも,実際にコードを見てみましょう(リスト1)。ITestインタフェースを表すインタフェース型です。(1)では,ITestがインタフェース型で,IUnknown型を継承していることを示しています。クラスでは,この部分が「TTest = class(TObject)」のようになっていました。「class」が「interface」,「TObject」クラスが「IUnknown」インタフェースに置き換わるだけで,基本的な構造は変わりません*1。(3)はメソッド宣言です。ここもクラスと同様ですね。

リスト1●ITestインタフェース
リスト1●ITestインタフェース
[画像のクリックで拡大表示]

 特徴的なのは(2)の部分です。クラスにはこのような文字列はありませんでした。これは,IID(Interface IDentifier)というもので,インタフェースを示す識別子です。

 Delphi言語のインタフェースには,IIDが付いている場合と付いていない場合があります。IIDが付いていないインタフェースは,外部に公開せずプログラム内だけで使用します*2。Javaなどのインタフェースと同様のものです。これに対し,IIDが付いているインタフェースは,アプリケーションに対して公開されるCOMコンポーネントになります。COMコンポーネントを使用するアプリケーションは,必要なコンポーネントを識別する必要があります。その識別に利用されるのがIIDなのです。IIDには,全世界のWindows上で一意であることが保証されたGUID(Globally Unique IDentifier)*3を使います。複数のインタフェースが同じ値を持っていると識別できなくなってしまうからです。