CLIP STUDIO PAINTのプラグインをC#で書きたい!(2)
あすかです。
前回投稿から1ヶ月がたってしまいました。。
この1ヶ月、夏コミにサークル参加するので、その準備(コピー本とかコピー本とかコピー本とか)をしてたりしました。
やっと一段落つきましたが、今度は冬コミ‥もとい来年2月のコミティアに向けて、技術本を書くことにしました。
技術本については、冬コミとコミティアのどちらかに当選次第、またこのブログで案内しますね。
というわけで、このブログの更新がしばらく雑になります。
さて、前回どういう話でしたっけ‥ああ、CLIP STUDIO PAINTのプラグインで使う関数をC#から呼び出す話でしたね。
マネージドコードからアンマネージドコードの関数を呼び出す時はDLLImportの利用が一般的ですが、
今回、SDK内の関数の定義を見るに、今回生成するC++のDLL内で関数が定義されているわけではないので、DllImportは使えません。
じゃあどうすればいいのでしょうか。C++で、SDKの関数を呼び出すラッパ関数を作っておいて、その関数のポインタを.NETに渡すことにします!
ただ、C++の関数のポインタをそのままマネージドコードに取り込むことはできないので、.NETのデリゲートというものを使います。
まず、C#のコードを以下のように修正します。
C#のクラスで、TestActionというプロパティを作ってみました。このプロパティに、C++の関数のポインタを登録します。
1~3行目と、9行目のobj->TestAction = gcnew System::Action(&FuncTest);
が、今回追加されたコードになります。
C++でまず関数を作っておいて、そのポインタをデリゲートとして.NETに渡す感じですね。
C#からSDKの関数を呼び出す時は、これを利用します。
といっても、今回はあまり時間をかけたくないので、getHostVersionProc
関数をC#から呼び出せるようにして、ホストのバージョンを画面に表示するプログラムを書いてみます。
まず、TriglavPluginCall
関数内のコードをちょっと修正します。C#プラグインを呼び出す関数の引数と、呼び出す位置を変えています。
次に、C#プラグインを呼び出す関数を修正しています。
関数のポインタをデリゲートに変換して、.NETのほうのプロパティに渡しています。
次はC#のマネージドコードです。
関数のポインタをデリゲートという形で受け取った上で呼び出しています。
これを実行してみると、見事ホストバージョンが画面に表示されました。
最新バージョンでは、ホストバージョンは3なんですね・・・。