PLUGIN/2.0†この文書は未だ開発者版です。予告なくごっそり変更される可能性があります。 はじめに†設計思想†
影響評価†処理系作者†処理系にいろいろ負担を移すことを前提としているので、覚悟してください(苦笑 プラグイン作者†新たにコール用にrequestエクスポートを定義するので、PLUGIN/1.0との衝突は考慮する必要はありません。 ゴースト作者†特定のプラグインにたとえ対応していなくてもデフォルトスクリプト仕様(後述)があるので致命的な事にならない。 利用者†ゴーストごとにちりぢりになった機能群をまとめて扱えるので便利かつ楽。 DLLエクスポート関数群†YAYA/KAWARI as PLUGIN利用者は読み飛ばして下さい
☆Borland系C/C++コンパイラでは_loadのように頭にアンダースコアがつくようですがそちらにも対応した方が良いでしょう。 load†読み込み時にコールされます。HGLOBALにDLLの入るディレクトリのパスが入ります。 返り値 - 常にtrue†規定ではロード失敗時にfalseですが、falseを返しても何も処理されません。 unload†DLL開放直前(=SSP/CROW終了時+上書きインストール時、DLL_PROCESS_DETACH前)にコールされます。 request†ロード・アンロード以外の処理はすべてここで行われます。 返り値 - 下記プロトコル説明のとおり†レスポンス用の返り値HGLOBALも、GlobalAlloc(GMEM_FIXED,xxx)で確保されたものにしてください。 リクエスト規定†典型的なリクエスト例は以下のとおりです。 GET PLUGIN/2.0 ID: OnGhostChange Charset: UTF-8 Reference0: 54 NOTIFY PLUGIN/2.0 ID: OnMenuExec Charset: UTF-8 Sender: 晶子 Reference0: 17982 ※改行コード=CR+LF 空行で終了。他のDLL仕様といっしょで、ゼロ終端とは限らないので注意してください。 PLUGIN/2.0のフォーマットは基本的にSHIORI/3.0仕様に準じています。 Reference等の内容に改行等を含めたい場合、また含めなければならないと規定したい場合は、%8f%73のように、回避したい文字のみURLエンコードして渡すよう規定することを *強く推奨* します(仕様ではありませんが) Senderの内容は、後述するゴースト側からの呼び出し仕様によって呼び出された場合、ゴースト名となります。 NOTIFYの方で来た場合、ゴースト側にイベントを送ったりすることはできません。 version [GET]†Referenceなし
必ずロード直後に呼ばれ、プラグインの情報を要求してきています。 versionリクエストのみレスポンス形式が特殊であることに注意してください。 installedplugin [NOTIFY]†Reference0以降:プラグイン名[\1]プラグインID インストール済のプラグインを列挙します。 ghostpathlist [NOTIFY]†balloonpathlist [NOTIFY]†headlinepathlist [NOTIFY]†pluginpathlist [NOTIFY]†Reference0以降:フォルダのフルパス
読み込み中のそれぞれ(ゴースト/バルーン/ヘッドライン/プラグイン)のフォルダを通知します。 OnSecondChange:秒変化†Referenceなし OnGhostBoot:ゴースト起動†OnGhostExit:ゴースト終了 [NOTIFY]†OnGhostInfoUpdate:シェル変化やHWND変更など、ゴースト情報の更新(load直後にも送られる可能性あり) [NOTIFY]†Reference0:sakura HWND[\1]kero HWND[\1]3 HWND[\1]4 HWND ... リクエストされるHWND群は、まだ構築されていない場合0が渡される可能性もあります。十分注意して扱ってください。 OnMenuExec†Reference群:上記のゴースト起動・状態変更イベントと同じ形式で、メニュー呼び出し元ゴースト情報が通知される プラグインメニュー等からそのプラグインが選択されたことを通知します。 OnInstallComplete : インストール終了†Reference0 : インストールタイプ(\1区切り) OnChoiceSelect(Ex)/OnAnchorSelect(Ex)/\qに指定したイベント†下のレスポンス規定を参照してください。 レスポンス規定†レスポンスの例は以下のとおりです。 CRLF区切りはリクエストと同様ですので[CRLF]は省略しています。 PLUGIN/2.0 200 OK Charset: Shift_JIS Target: 54 Event: OnResourceLow EventOption: notify Reference0: 19 Reference1: 31 Reference2: 65 Script: すくりぷと~ ScriptOption: nobreak,notranslate ※複数起動対応の処理系のみ※
現在起動中のゴーストでTargetに該当するゴーストがいたらそれで処理されます。 該当しない場合、何も指定しない場合は処理系に応じて適当なゴースト「1体」で処理されます。 ※対応していない処理系ではそもそも1体しかありませんのでそのゴーストが毎度呼び出されます。 Event/Reference†EventヘッダとReferenceヘッダはゴースト側に送るイベントです。 ScriptOption†ScriptOptionは、スクリプトヘッダ内容にのみ適用されるオプション指定です。
EventOption†EventOptionは、Eventヘッダ内容にのみ適用されるオプション指定です。
Event,EventOption,Reference,Target,Script,ScriptOptionはすべて省略可能です。 選択肢フック†プラグインのレスポンスでかえってきたスクリプト内、またはEventヘッダでゴーストにイベント通知して帰ってきたスクリプト内に選択肢があれば、その1回分だけOnChoiceSelect(Ex)/OnAnchorSelect(Ex)/On????をプラグインに横流しします。 プラグインID†プラグインごとに一意につけられるIDです。 それなりに開発環境をそろえておられる方なら、guidgen.exeのRegistry Formatが生成に使えると思います。 descript.txtのIDエントリに、次のように書いてください。 ゴースト側からはプラグイン名以外にこのIDを使ってプラグインを呼び出すことができます。 descript.txt†プラグイン特有のエントリのみ記述します。 secondchangeinterval†OnSecondChangeを呼ぶ間隔を指定します。もちろん標準値は1です。 0にするとOnSecondChage自体を送信しません。 disableAllNotifyCall†上記の全てのリクエストを一切停止します。 load/unloadのみでアプリケーションにフックをかけ、他は要らないというプラグインに有用でしょう。 ゴースト側拡張†スクリプト拡張†\![raiseplugin,プラグイン名,イベント,Reference0...] \![raiseplugin,プラグインID,イベント,Reference0...] 指定したプラグインに指定したイベントを(GETで)送信します。 プラグイン側でTarget指定がない限り(system_any)、プラグインからのレスポンスはraisepluginしたゴーストに優先的に割り振られますので、SAORIもどき的な使い方も可能です。 SHIORIイベント拡張†NOTIFY SHIORI/3.0 ID: installedplugin Reference0以降:プラグイン名[\1]プラグインID インストール済のプラグインを列挙します。バイト値1区切りでプラグイン名、プラグインIDとなります。 プラグインIDは必ず存在するものではありません。 インストール†INSTALL/1.5を参照 |