[[PSDK:http://www.praesens.co.jp/pws/develop/download_pdk.phtml]] の plugin.txt から軽くまとめ。

#contents

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

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

** PWCDestroyInstance [#q596bf83]
#highlight(cpp:nogutter:nocontrols){{
extern "C" __declspec(dllexport)
void __stdcall PWCDestroyInstance(TPWPInstance *instance)
}}

** PWCDestroy [#l0d4fc13]
#highlight(cpp:nogutter:nocontrols){{
extern "C" __declspec(dllexport)
void __stdcall PWCDestroy()
}}

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

* 綾織側から呼ぶプラグイン関数(import)の登録 [#i23892f1]
** PWPRegisterAyaoriFunc2 [#c8404f19]
#highlight(cpp:nogutter:nocontrols){{
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)を呼ぶ [#vcf539b1]
** PWPInvoke [#qf44eb8f]
#highlight(cpp:nogutter:nocontrols){{
int PWPInvoke(
        TPWPInstance* instance,
        DWORD style,
        char* pcType,
        char* pcFname,
        TPWPInvokeProc pCallback,
        DWORD param,
        ... );
}}
- 綾織関数の呼び出し成否や戻り値はpCallbackに指定した関数がコールバックされたとき引数として取得できる
- pcTypeとpcFnameがconstでないのはなんでなんだぜ
- 綾織から呼んだプラグイン関数の中でInvokeしようとすると本体側で読み込み違反が出た
-- イベントコールバック関数,メニューコールバック関数,タイマコールバック関数,同期コールバック関数から呼ぶべきか


* Visual Studioで作る場合 [#s33de7c0]
** DLL関数のエクスポート [#k35130d8]
- 普通にやると序数付きでexportされる(PWCInitialize@4 みたいな)ので .def ファイルを作る
 LIBRARY   HogehogePlugin
 
 EXPORTS
 	PWCInitialize
 	PWCDestroy
 	PWCNewInstance
 	PWCDestroyInstance
- 構成プロパティ→リンカー→入力→モジュール定義ファイル に作成した .def ファイルを追加
- exportされている関数はDependency Walkerあたりでチェックできる
- [[DEF ファイルを使った DLL からのエクスポート:http://msdn.microsoft.com/ja-jp/library/d91k01sh.aspx]]

* その他メモ [#defb263d]
- GetPluginMajor/MinorVersion() で得られる値は PRODUCTVERSION のもの
- plugin.txt の PWPGetDataFolder → PWPGetPersonaDataFolder


#highlight(end)