Entering Passive Mode

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

プラグイン固有の設定画面の表示

「設定」ボタンも Application::ConfigureProc で処理されるので、
IDC_CONFIGURE 向けの WM_COMMAND メッセージを処理すればよい。

プラグイン用の設定画面の呼び出しも、一覧表示と同じように作る。
ConfigureProc メソッドをマネージにしないように、
ConfigurePlugin という名前のヘルパメソッドに分離する。

msclr::gcroot 構造体テンプレート

ISaver 実装型一覧に表示できるようになったので、
次は「設定」ボタンで設定画面を呼び出せるようにしたい。

設定画面を呼び出すには、設定ボタンを押した際に、
コンボボックスに選択されている名前に対応した
ISaver 実装型のインスタンスを作れば良いのだ。

コンボボックスに CB_GETCURSEL メッセージを送れば、
現在選択されている項目のインデックス(数値)が得られるので、
その数値を元に Manager クラスのインデクサから Type を得れば良い。

タイトルの一覧表示

Manager ができたので、これを使ってダイアログボックスに一覧表示するのだが、
プラグインには ISaver2 を実装していないものも存在する。

ISaver2 を実装している場合は Name プロパティを使えば良いが、
ISaver しか実装していない場合は、クラスの簡易名を使うことにしよう。
簡易名とは、名前空間を含まないクラスの名前部分のみを示す。

例えば、HelloSaver は ISaver2 を実装していないため、
クラス名である「HelloSaver」を名前として表示することになる。

設定ダイアログは Application::ConfigureProc で処理されているので、
WM_INITDIALOG メッセージを拾ってコンボボックスに設定する。

プラグインのロードと列挙

プラグインのロードはManager クラスのコンストラクタで行う。

手順としては、plugin フォルダの内部からアセンブリを探し、順にロードする。
そして、ロードしたアセンブリの中から、ISaver 実装型を検索するという流れだ。

Manager マネージクラス

プラグインとなるアセンブリはできたが、
それをホストが見つけて読み込むためには、
プラグインの登録方法をルール化しなければならない。

今回は、ホストのあるフォルダに「plugins」サブフォルダを作成し、
その中にアセンブリを放り込むというルールにしよう。

早速、HelloSaver.dll と HelloSaver2.dll を放り込む。

+ scrhost.scr
+ plugins\
+ HelloSaver.dll
+ HelloSaver2.dll

HelloSaver2

HelloSaver を修正して ISaver2 を実装させても良いのだが、
以前作った HelloSaver(HelloSaver.dll)はそのまま残しておき、
新たに ISaver2 を実装した HelloSaver2 を作る。

これを HelloSaver2.dll という名前でビルドすれば、
旧コードベースの HelloSaver.dll と、新しい HelloSaver2.dll を
混在させた状態でテストすることができるだろうし。

スクリーンセーバのタイトル

スクリーンセーバーを選択するリストボックスには何を表示すれば良いか。

スクリーンセーバーは ISaver を実装するクラスなのだが、
現在の ISaver には、特別なプロパティがないため、
クラスの FQCN くらいしか名前として使えそうなものがない。

そこで、ISaver に名前を得るためのプロパティ 'Name' を追加して、
ISaver を実装するクラスから名前を取得する事ができるようにする。
そして、ホストではこれをリストボックスに表示するようにしよう。

ただし、インタフェースを変更するのは御法度だ。
開発用ライブラリ「Loafer.ScreenSaver.dll」を既にリリースしていた場合、
既存のスクリーンセーバーは古い ISaver を実装してコンパイルされている。

プラグイン選択ダイアログ

プラグインダイアログ

ISaver を実装しているプラグインが複数ある場合、
実行に使うプラグインを決めなければならない。

これを決めるのはもちろん利用者なので、
その設定を行うプラグイン管理画面が必要となる。

ということで、ホストのダイアログボックスを改造し、
好きなプラグインを選択できるようにしてみよう。

リソースファイルを書き換え、
スクリーンセーバーの名前と、
ダイアログボックスの定義を書き換える。

プラグインの動的ロード

プラグインを動的に読み込む所から考えてみよう。

現在 Dispatcher.cpp では、#using ディレクティブを使い、
<HelloSaver.dll> を直接参照しているため、
以下のコード断片だけでインスタンスを作成できる。

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

これを動的に読み込むように切り替えるためには、
まず、HelloSaver.dll への依存を外さなければならない。
そうなると、「HelloSaver」のように、
プラグイン実装のクラス型を直接使うことはできないため、
リフレクションを使ってアクセスすることになる。

ホストの改善 #1: 構想を練る

次のステップに進むか。

現状のホストには大きな制限がある。
それはリソースの問題だ。

スクリーンセーバーの名前とアイコンは、
ホストに Windows のリソースとして埋め込まれる。
これらは、プラグインで置き換えることはできない。

これにより生じる制約は以下の 2 つ。
・表示するスクリーンセーバーの名前を変えられない
・スクリーンセーバーのアイコンを変えられない。

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