最近の記事
- 4/22 - 思い出の紙時計
- 3/29 - さくらインターネットの VPS リニューアル
- 3/19 - SSHD への攻撃を分析してみた
- 3/9 - キーボードの過酷さ
- 3/8 - .NET のパフォーマンスについて
- 3/7 - phpMyAdmin への攻撃
- 3/1 - ミイラ取りがミイラになりかけた
- 2/22 - URL を知らなければ安全だと?
- 2/16 - 決意
- 1/30 - ルーターの UPnP 対応状況
Entering Passive Mode
いきなり出てきた % の文字。これはなんだろうか。
どう見ても剰余演算子の % ではない。
コードを再掲してみよう。
void Dispatcher::Configure(HWND hdlg) {
// スクリーンセーバーを作成
HelloSaver saver;
// HWND のラッパーを作成
HwndWrapper window(hdlg);
最初に、Dispatcher::Configure を作ってみよう。
void Dispatcher::Configure(HWND hdlg) {
// スクリーンセーバーを作成
HelloSaver saver;
// 設定画面を呼び出す
saver.Configure(hdlg); // ダメ
}
最後の 1 つは、Dispatcher だ、
プラグインを Dispatcher が一括して管理することで、
Application とプラグインとの分離を図る。
この際、Dispatcher が受け取るのは、
ネイティブウィンドウメッセージだが、
呼び出すのは CLI の ISaver インタフェースだ。
Dispatcher は、マネージャとして機能し、
この差異を吸収する必要があるため、
それなりの工数が必要になりそうだ。
昨日の続き。MainProc の実装を行う。
MainProc は、スクリーンセーバー本体の
ウィンドウプロシージャーである。
scrnsave.lib に用意されている
DefScreenSaverProc 関数を使えば、
スクリーンセーバー固有の処理を任せることができるため、
MainProc 内部はそれほど複雑にならない。
========== Application.cpp ==========
続いて、Application.cpp を作る。
Application.hpp は、クラスの外枠しか含まれていない。
これは、いわゆるメタデータであり、
そこには実体(メソッド本体や静的データ)はない。
Application.cpp では、それらの実体を定義する。
========== Application.cpp ==========
#include "config.hpp"
#include "Application.hpp"
最初は、module.cpp を作る。
Application クラスのメソッドを呼ぶだけなので単純だ。
========== module.cpp ==========
#include "config.hpp"
#include "Application.hpp"
#pragma unmanaged
// Application インスタンス
// ファイルプライベート(手抜き)
namespace {
Loafer::ScreenSaver::Host::Application application;
}
ホストでは、C++/CLI を使って開発をすることになるが、
既存の C++ コードと混ざる形となるため、
プログラムの見通しが悪くなりやすい。
そこで、ホストのコードを機能に合わせて分割しよう。
C++ ピュアな部分と C++/CLI の部分にだ。
そうしておけば、C++/CLI の導入を最低限で済ませられる。
1. scrnsave.lib 用の関数実装 (module.cpp, C++)
2. Application クラス(Application.cpp, C++)
3. Dispatcher クラス(Dispatcher.cpp, C++/CLI)
今日は、昨日作った開発用のライブラリを使って、
適当なサンプルとなるプラグイン実装を用意する。
例によって Hello World にでもしとこうか。
========== HelloSaver.cs ==========
using System;
using System.Drawing;
using System.Windows.Forms;
最初に作るのは、プラグイン開発用のライブラリだ。
これは、結合ルールを明確にするために参照される。
ホストの呼び出し手順をインタフェースという形で定め、
それをプラグインが実装することで結合する。
インタフェースは C# を使って書くことにしよう。
名前は………単純に ISaver とでもするか。
========== ISaver.cs ==========
モジュール分割をするにあたって、
もう一つ C++/CLI という面白い技術を取り入れてみよう。
C++/CLI とは、C++ 言語を拡張し、
CLI (共通言語基盤)に対応した言語である。
C++/CLI を使えば、Visual Basic.NET や C# と同じように、
C++ 言語の構文を使ってアセンブリを作成することができる。
もちろん、.NET Framework を使うこともできるし、
C# 等で作ったクラスライブラリを参照することもできる。