このアーカイブは同期化されません。 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 実装)
明日からは、コメントで示した処理手順を
メソッド内に実装していくことになる。