2007 年 8 月 29 日 22 時 3 分

ホストの作成 #5: Dispatcher クラス


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


最後の 1 つは、Dispatcher だ、
プラグインを Dispatcher が一括して管理することで、
Application とプラグインとの分離を図る。

この際、Dispatcher が受け取るのは、
ネイティブウィンドウメッセージだが、
呼び出すのは CLI の ISaver インタフェースだ。

Dispatcher は、マネージャとして機能し、
この差異を吸収する必要があるため、
それなりの工数が必要になりそうだ。

ISaver を扱うためには、C++/CLI が必須であり、
純粋な C++ とはかなり異なるコーディングとなる。
そこで、まずは枠組みだけ作り、処理手順を考える。

========== Dispatcher.cpp ==========

#include "config.hpp"
#include "Dispatcher.hpp"
#include "HwndWrapper.hpp"

#using <System.dll>
#using <System.Drawing.dll>
#using <System.Windows.Forms.dll>

#using "Loafer.ScreenSaver.dll"
#using "HelloSaver.dll"

using namespace System;
using namespace System::Drawing;
using namespace System::Windows::Forms;
using namespace System::Runtime::InteropServices;
using namespace Loafer::ScreenSaver::Plugins;

namespace Loafer {
namespace ScreenSaver {
namespace Host {

Dispatcher::Dispatcher() {
}

Dispatcher::~Dispatcher() {
}

void Dispatcher::Configure(HWND hdlg) {
    // HelloSaver インスタンスを作成し、
    // hdlg を IWin32Window にラップし、
    // 上記を引数に Configure を呼び出す。
}

void Dispatcher::Create(HWND hwnd) {
    // HelloSaver インスタンスを作成し、
    // そのインスタンスをどこかに保存。
    // hwnd を IWin32Window にラップし、
    // ウィンドウのサイズを取得し、
    // それらを引数に Create を呼び出す。
}

void Dispatcher::Destroy(HWND hwnd) {
    // HelloSaver インスタンスを取り出し、
    // Destroy を呼び出し、
    // インスタンスを破棄
}

void Dispatcher::Paint(HWND hwnd) {
    // BeginPaint で HDC とクリッピング領域を得る
    // HelloSaver インスタンスを取り出し、
    // HDC を Graphics にラップし、
    // クリッピング領域を Rectangle にラップし、
    // Paint を呼び出し、
    // EndPaint で描画完了。
}

}}} // Loafer::ScreenSaver::Host

========== end of Dispatcher.cpp ==========

今のところ、まだまだ C++ に近いが、
#using ディレクティブが登場した。
これは、アセンブリの参照を表している。

C 言語では、ヘッダファイルを #include するのが普通だが、
.NET には C 言語のようにヘッダファイルがなく、
その代わりに、アセンブリ自身にメタデータが含まれている。

#using ディレクティブを使うことで、
アセンブリに含まれるメタデータが取り込まれ、
アセンブリのコードを呼び出せるようになるわけだ。

cl のコンパイラオプション /FU でも参照できるが、
ソースコードに埋め込んでおいた方が楽だろう。

#using の構文は #include に似ており、
<ファイル名> でも "ファイル名" でも指定できるが、
#include と違い、両者に特に違いはないようだ。

.NET Framework の標準アセンブリの場合は、
< > を使って参照させるように書くことにした。

参照が必要なアセンブリは 6 つあるが、
CLI の基幹を成す mscorlib.dll は自動的に参照されるため、
#using が必要なのは 5 つとなる。
後ろの 2 つは、以前作ったものだ。

・System.dll(拡張システム系)
・System.Drawing.dll(GDIPLUS 描画系)
・System.Windows.Forms.dll(Windows GUI 系)
・Loafer.ScreenSaver.dll(ISaver 定義)
・HelloSaver.dll(HelloSaver 実装)

明日からは、コメントで示した処理手順を
メソッド内に実装していくことになる。



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