PSDK の plugin.txt から軽くまとめ。

必須コールバック Edit

PWCInitialize Edit

extern "C" __declspec(dllexport)
BOOL __stdcall PWCInitialize(int major, int minor, const char *substr, const struct TPWPFunctions *p)
  • プラグインが本体からロードされるときに呼ばれる(非常駐型だとキャラクタからLoadPlugin()したとき)
  • pにはシステム関数へのポインタが格納された構造体へのポインタが渡される
    • これ以降渡されることはないので,プラグイン内部で構造体をコピーして保持しておく必要がある

PWCNewInstance Edit

extern "C" __declspec(dllexport)
int __stdcall PWCNewInstance(TPWPInstance *instance, const char *vendor, const char *type)
  • キャラクタ毎に呼ばれる
    • instanceはシステムからのキャラクタに関連した各種コールバック時にたびたび渡される
    • システム関数を呼ぶときの引数にinstanceが必要なものがほとんど
    • キャラクタが再起動(ScriptUpdatedとかで)すると再度呼ばれる(新しいプラグインインスタンスになる)

PWCDestroyInstance Edit

extern "C" __declspec(dllexport)
void __stdcall PWCDestroyInstance(TPWPInstance *instance)

PWCDestroy Edit

extern "C" __declspec(dllexport)
void __stdcall PWCDestroy()

イベントコールバック Edit

  • 標準アクション実行前にプラグインの各関数が呼ばれる
    • 標準アクションが実行できない状態(他のアクションが実行中)でも,標準アクションに対応するプラグイン側コールバック関数は呼び出される

綾織側から呼ぶプラグイン関数(import)の登録 Edit

PWPRegisterAyaoriFunc2 Edit

int __stdcall PWPRegisterAyaoriFunc2(
    TPWPInstance*   instance,
    const char*     pcFname,
    TPWCPluginProc2 func,
    const char*     pcType,
    DWORD param
);
  • struct TPWPFunctions f; として f にシステム関数をコピーしてあるとすると f.PWPRegisterAyaoriFunc2(...); として呼ぶ
  • funcにTPWCPluginProc2型の関数ポインタを渡す
  • 綾織側で呼ばれるとfuncに指定した関数がコールバックされる

プラグイン側から綾織関数(export)を呼ぶ Edit

PWPInvoke Edit

int PWPInvoke(
        TPWPInstance* instance,
        DWORD style,
        char* pcType,
        char* pcFname,
        TPWPInvokeProc pCallback,
        DWORD param,
        ... );
  • 綾織関数の呼び出し成否や戻り値はpCallbackに指定した関数がコールバックされたとき引数として取得できる
  • pcTypeとpcFnameがconstでないのはなんでなんだぜ
  • 綾織から呼んだプラグイン関数の中でInvokeしようとすると本体側で読み込み違反が出た
    • イベントコールバック関数,メニューコールバック関数,タイマコールバック関数,同期コールバック関数から呼ぶべきか

Visual Studioで作る場合 Edit

DLL関数のエクスポート Edit

  • 普通にやると序数付きでexportされる(PWCInitialize@4 みたいな)ので .def ファイルを作る
    LIBRARY   HogehogePlugin
    
    EXPORTS
    	PWCInitialize
    	PWCDestroy
    	PWCNewInstance
    	PWCDestroyInstance
  • 構成プロパティ→リンカー→入力→モジュール定義ファイル に作成した .def ファイルを追加
  • exportされている関数はDependency Walkerあたりでチェックできる
  • DEF ファイルを使った DLL からのエクスポート

その他メモ Edit

  • GetPluginMajor/MinorVersion() で得られる値は PRODUCTVERSION のもの
  • plugin.txt の PWPGetDataFolder → PWPGetPersonaDataFolder