Entering Passive Mode

カテゴリ 'C++/CLI' の記事
< 1 2 3 4 >

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

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

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

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

ホストの作成 #4: 描画システム

昨日の続き。MainProc の実装を行う。

MainProc は、スクリーンセーバー本体の
ウィンドウプロシージャーである。

scrnsave.lib に用意されている
DefScreenSaverProc 関数を使えば、
スクリーンセーバー固有の処理を任せることができるため、
MainProc 内部はそれほど複雑にならない。

========== Application.cpp ==========

ホストの作成 #3: Application クラス

続いて、Application.cpp を作る。

Application.hpp は、クラスの外枠しか含まれていない。
これは、いわゆるメタデータであり、
そこには実体(メソッド本体や静的データ)はない。
Application.cpp では、それらの実体を定義する。

========== Application.cpp ==========

#include "config.hpp"
#include "Application.hpp"

ホストの作成 #2: scrnsave.lib 互換モジュール

最初は、module.cpp を作る。
Application クラスのメソッドを呼ぶだけなので単純だ。

========== module.cpp ==========

#include "config.hpp"
#include "Application.hpp"

#pragma unmanaged

// Application インスタンス
// ファイルプライベート(手抜き)
namespace {
    Loafer::ScreenSaver::Host::Application application;
}

ホストの作成 #1: コードの機能分割

ホストでは、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 (共通言語基盤)に対応した言語である。

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 スイッチは、出力ファイル名を明示する際に指定する。

< 1 2 3 4 >
このページのトップへ戻る
© 2008 Project Loafer/Project Fireball and all blog writers. Powered by Nucleus CMS