アークピットのホームページに戻る

WinAPIトピックのトップページに戻る

APIトピックの各章に移動する

ダウンロードのページに移動する
ダウンロードができ
ない場合の対処法
 

ページ移動

1-2-8. コンポーネント化

 コンポーネント化すると、機能の再利用が容易になります。また処理を隠蔽できますので、使用者は考慮する点が減り大変利用しやすくなります。機能とそれを実現するための方法だけ、規定しておけば、自由に誰でもその機能を自分のアプリケーションに組み込むことができます。そんな技術がコンポーネント化です。

 ただし良い所ばかりでもありません。コンポーネント化は、コードの再利用が目的ですので、仕事は省力化できますが、パフォーマンスの点では、やや劣ります。考えてみてください。機能が必要かどうかは、利用者が決めますが、コンポーネント化では、不必要な機能まで盛り込むことになります。結果コードサイズが膨らみます。個人が自分のためだけに作成するのなら、何とかなりますが、多数の用途に必要と思われる機能を多く提供すると、必然的に無駄が多く発生します。特にC++のクラスの代表のMFCは、非常にコードサイズが膨らみます。

 Windowsには、以下のコンポーネント化の技術が最初から用意されています。またプログラミング言語で実現できることもあります。

  • ウィンドウクラス
  • サブクラス
  • ウィンドウズフック
  • DLL技術
  • インターフェース(COMやOLE)
  • C++のクラス

ウィンドウクラス

 コントロールは、ウィンドウクラスで実現したコンポーネントです。このクラスでは、以下の技法で制御します。
  1. RegisterClass でクラスを登録する
  2. CreateWindow でウィンドウを作成する
  3. SendMessage で設定や受信を行い通信する
  4. WM_NOTYFY,WM_COMMAND メッセージで通知を受信する
  5. DestroyWindow でウィンドウを破棄する
  6. UnregisterClassでクラスを破棄する
 コントロールは、これと同時にDLL技法も使用していますので、InitControlsの初期化だけ行なえば、いつでも用意された便利な機能を、簡単に使用することができます。  またウィンドウクラスでは、より多くの目的に使用できるように、以下の技法がサポートされています。
  • SetClassLongでクラス別に値を設定
  • SetWindowLongでウィンドウ別に値を設定
  • ウィンドウプロパティ
 これらによって、クラスごとに、あるいはウィンドウごとに、値を設定できますので、ウィンドウプロシージャ次第では、いろいろな目的のクラスやウィンドウを、その値で判断することにより、1つのプロシージャで実現できます。

サブクラス

 サブクラスは、コントロールなどの機能拡張に良く使用されます。ウィンドウの本来のプロシージャにフックを掛け、別のユーザが作成した関数に飛ばします。そしてその関数では、メッセージを追加や横取りして、機能を拡張または、統合して目的に添った改変を行ないます。
 サブクラスは、ウィンドウごとに管理しているプロシージャアドレスを変更します。よって対象のウィンドウしかその機能は搭載されません。以下の方法でサブクラス化を行ないます。
  1. GetWindowLongでオリジナルのプロシージャを得る。
  2. SetWindowLongで新しいプロシージャを設定する。
  3. 新しいプロシージャでは、新機能のメッセージをフックして処理を行なう。
  4. さらに新しいプロシージャは、オリジナルのプロシージャにジャンプする。
 つまりサブクラスとは、フック技術そのものです。フック(横取り)して利用者に都合のよい改変を行ないます。コントロールのキーボードインターフェースを付加する時などに、良くサブクラスを使用します。

ウィンドウズフック

 一般のフックと、Windowsが用意しているフックシステムとは、やや意味が異なります。フックとは、途中でプロシージャを横取りする技術ですが、Windowsは、特定のメッセージの流れを故意に変更するための機構を用意しています。それがここで言うウィンドウズフックです。
  • WH_CALLWNDPROC(ウィンドウプロシージャの横取り)
  • WH_CBT(ウィンドウ操作やメッセージキューの横取り)
  • WH_DEBUG(他のフックに関連付けられているフックプロシージャを横取り)
  • WH_GETMESSAGE(GetMessage関数やPeekMessageの監視)
  • WH_JOURNALRECORD(マウスやキーの入力イベントを監視、 記録)
  • WH_JOURNALPLAYBACK(WH_JOURNALRECORDで記録したメッセージを再生)
  • WH_KEYBOARD(キーの入力イベントを監視)
  • WH_MOUSE(マウス入力を監視)
  • WH_MSGFILTER(メニューやスクロールバー、 メッセージボックス、 ダイアログ ボックスが処理しようとしているメッセージを監視)
  • WH_SYSMSGFILTER
  • WH_SHELL(シェル処理を監視)

DLL技術

 DLLは、ダイナミックリンクライブラリの意味で、利用者の処理で、メモリ上にロードして実行できるライブラリです。作成したAPIや各種のプロシージャなどを複数のアプリケーションで使用するときは、DLL化して同じコードがメモリで複数展開されることを防ぎます。
 またDLL化することで、アプリケーションの拡張性が高まります。つまりインターフェースを共通化して、複数のDLLでいろいろな形式をサポートできます。またそのインターフェースを公開すれば、パブリックの開かれたシステムになります。例えば、ファイルのアーカイブソフトで、UNLHA.DLLやUNARC.DLLやUNCAB.DLLなどを使用します。これらは、インターフェースが共通で、いろいろな形式の圧縮解凍を行ないます。

インターフェース

 ここで言うインターフェースとは、OLEやCOMで使用されている、C++のクラスに似たシステムコールの手段です。

ページ移動