Entering Passive Mode

2007-08 - カテゴリ 'C++/CLI' の記事
< 1 2 >

C++/CLI #2: ハンドル ^ とハンドル演算子 %

いきなり出てきた % の文字。これはなんだろうか。
どう見ても剰余演算子の % ではない。

コードを再掲してみよう。

    void Dispatcher::Configure(HWND hdlg) {

        // スクリーンセーバーを作成
        HelloSaver saver;

        // HWND のラッパーを作成
        HwndWrapper window(hdlg);

C++/CLI #1: HwndWrapper マネージクラス

最初に、Dispatcher::Configure を作ってみよう。

    void Dispatcher::Configure(HWND hdlg) {

        // スクリーンセーバーを作成
        HelloSaver saver;

        // 設定画面を呼び出す
        saver.Configure(hdlg); // ダメ

    }

ホストの作成 #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# 等で作ったクラスライブラリを参照することもできる。

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