PLUGIN/1.0 |
概要 plugin ディレクトリ下に以下の形式でファイルを配置すると、その DLL は embryo 起動と同時にロードされ、終了まで常駐する。embryo は notify インターフェースにより、これらの DLL にイベントの通知を行う。embryo のポップアップメニューには「プラグイン」サブメニューがあり、そこから各プラグインの設定を行うことができる。以上3点以外のことは何もしない。この構造によりこの DLL は起動トリガが exe の起動から DLL のロードに変化し、メッセージフック等トリッキーな手法を用いずに正確に本体の状態を把握することが可能な外部プログラムとして動作する。 home +--plugin +--dummy +--descript.txt +--dummy.dll |
PLUGIN/1.0 descript.txt にはこのプラグイン固有の定義情報を記述する。 特に省略可能と明記しない限り全てのエントリは必須。 name,ダミー filename,dummy.dll name エントリはこのプラグインの名称を表す。 filename エントリは実体となる DLL の名称を表す。 plugin DLL は以下の関数を export する。 extern "C" __declspec(dllexport) HGLOBAL __cdecl getversion(long *len); extern "C" __declspec(dllexport) BOOL __cdecl load(HGLOBAL h, long len); extern "C" __declspec(dllexport) BOOL __cdecl unload(); extern "C" __declspec(dllexport) void __cdecl notify(HGLOBAL h, long *len); extern "C" __declspec(dllexport) void __cdecl configure(HWND h); データは全て HGLOBAL で引き渡され、long len にはそのデータサイズが格納される。渡されるハンドルの解放は全て渡された側に委ねられており、渡した側では解放を行わない。 getversion はロード時にコールされる。Plugin DLL は PLUGIN/1.0 という 10 バイトの文字列を返さなくてはならない。 load および unload はそれぞれ DLL のロード時/アンロード時にコールされる。load には引数として plugin が位置するディレクトリの絶対パスが渡される。plugin が独自に設定ファイル等を管理する場合、自らに属するファイルは全てこのディレクトリより下層に配置しなくてはならない。 notify はイベント通知時にコールされる。notify で渡される文字列は下記に代表されるような一定のフォーマットを持つ。 NOTIFY PLUGIN/1.0 Event: OnGhostChanged Reference0: さくら 各行は cr+lf でセパレートされ、cr+lf 2つでターミネートされる。この文字列に対してパースを行えば、プラグインは自らの動作に必要な情報を取り出すことができる。
イベント識別子の一覧は後述する。 イベントを通知する、という点では、notify は SHIORI 等の request と非常によく似ている。しかし本体側がスクリプトを求めていないという点で大きく異なる(プラグインに人格はない)。そのためコマンドは request でなく notify であり、戻り値は void である。 configure はポップアップメニュー上からこのプラグインが選択された場合、つまり設定ダイアログを開かなくてはならない場合にコールされる。例え設定項目がなかったとしてもこの関数は必ず実装する必要がある。またユーザの混乱を防ぐため最悪でも messagebox を用いて about を行う程度の動作は行わなくてはならない。 以下、イベントに参照情報が存在しない場合はその記述自体を省略する。
|
戻る |