最近の記事
- 9/1 - 将棋始めました
- 5/16 - サーバー引っ越し
- 4/24 - 優先順位
- 3/17 - vbNullString と 空文字列 ""
- 3/15 - InputBox 関数の戻り値
- 3/13 - 紙と Excel と VBA
- 3/9 - 未だに Visual Basic 6
- 11/14 - ぼて閉鎖
- 11/9 - 関数オブジェクトの呼び出し
- 9/7 - メソッドとしての関数オブジェクト
Entering Passive Mode
最後の 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# 等で作ったクラスライブラリを参照することもできる。
スクリーンセーバーとして最低限の機能は作った。
後は好き勝手にコードを追加していけばいいのだが、
それだけではあんまり面白くない。
なので、ちょっと違うことを考えてみよう。
スクリーンセーバーの機能を大きく分けると以下の 2 つだ。
・引数処理など、どのスクリーンセーバーでも共通の処理。
・描画や設定画面など、スクリーンセーバー固有の処理。
これで、リソースと関数が揃った。
後は Windows の実行イメージファイルを作るだけだ。
最初に、module.cpp をコンパイルして、
オブジェクトファイル module.obj を作成する。
Microsoft の C++ コンパイラは、cl.exe だ。
$ cl /c /W4 /Fomodule.obj module.cpp
/c スイッチは、ソースコードをコンパイルして、
オブジェクトファイルを作成する事を示す。
/W4 スイッチは、警告レベルを 4 に設定する。
これで、些細なことでも警告が出るようになる。
厳格なプログラミングには必須である。
/Fo スイッチは、出力ファイル名を明示する際に指定する。