CGI State: None
document

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


    descript.txt にはこのプラグイン固有の定義情報を記述する。

    特に省略可能と明記しない限り全てのエントリは必須。


    name,ダミー
    filename,dummy.dll


    name エントリはこのプラグインの名称を表す。

    filename エントリは実体となる DLL の名称を表す。


  • 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つでターミネートされる。この文字列に対してパースを行えば、プラグインは自らの動作に必要な情報を取り出すことができる。

    Event
    イベント識別子
    Reference*
    イベントに付帯する参照情報(最大 Reference7 まで)

    イベント識別子の一覧は後述する。


    イベントを通知する、という点では、notify は SHIORI 等の request と非常によく似ている。しかし本体側がスクリプトを求めていないという点で大きく異なる(プラグインに人格はない)。そのためコマンドは request でなく notify であり、戻り値は void である。


    configure はポップアップメニュー上からこのプラグインが選択された場合、つまり設定ダイアログを開かなくてはならない場合にコールされる。例え設定項目がなかったとしてもこの関数は必ず実装する必要がある。またユーザの混乱を防ぐため最悪でも messagebox を用いて about を行う程度の動作は行わなくてはならない。


  • notify イベント一覧


    以下、イベントに参照情報が存在しない場合はその記述自体を省略する。


    OnSecondChange
    秒変化

    OnGhostChange
    ゴースト変化
    OnShellChange
    シェル変化

    Reference0
    現在のゴースト名
    Reference1
    現在のシェル名

    OnVisibleChange
    可視状態変化

    Reference0
    スコープ(0: sakura / 1: kero)
    Reference1
    変化後の可視状態(0: invisible / 1: visible)

    OnBoot
    起動

    Reference0
    sakura HWND
    Reference1
    kero HWND

  • 戻る