NPAPI プラグインの作り方 for Windows その4
ずいぶん更新が止まってしまいましたが、NPAPI プラグインの作り方の続きです。
今回は、サンプルが動くようにしてみます。
なお、今回のサンプルは、GitHub のページからダウンロードできます。
サンプルの動作のさせ方
まず、前回作成したサンプルの NPAPI プラグインを動作させてみます。
ただし、もともとのサンプルのプラグインのバグが原因で、まだ正しく動作しません。
プラグインの登録
Firefox の場合
Firefox の場合は、インストールされたディレクトリ (C:\Program Files\Mozilla Firefox
など) の下に plugins
というディレクトリがあるので、その下に作成した DLL をコピーします。
これで、次回以降の起動でプラグインが動作するようになります。
Google Chrome の場合
Google Chrome の場合は、拡張機能を作成するのが簡単だと思います。
Google Chrome の拡張機能の作り方は、Chrome Extensions API リファレンスなどを参照してください。
バックグラウンドページのみを持つような拡張機能を作成し、以下のような plugins
属性を持った manifest ファイルを作成します。
1 2 3 4 5 6 | "plugins" : [ { "path" : "npsample.dll" , "public" : true } ], |
public
を true
にしておくと、プラグインをどのページからでも参照できるようになります。
ただし、これはセキュリティホールになることが多いので、テスト環境のみにした方が無難だと思います。
「ツール」-「拡張機能」を開き、デベロッパーモードにチェックを入れた上で「パッケージ化されていない拡張を読み込む...」で読み込むと、プラグインを使えるようになります。
テスト用 HTML の用意
前回の Firefox の公式ページのサンプル npruntime には、テスト用のファイル test.html
が含まれていますので、これをブラウザで開きます。
画面の下の方にはいくつかボタンが並んでいると思いますが、これらを押すと、本来ならメッセージがポップアップ表示されるはずです。
しかし、ページ読み込み時かボタンクリック時に、ブラウザが「プラグインがクラッシュした」というようなメッセージを出してくると思います。
そうならない場合は、プラグインが正しく読み込まれていない可能性が高いので、手順を確認してください。
なお、test.html
内には二つの embed
タグがありますが、今回作成したサンプルは、一つ目の embed
タグに対して読み込まれます。
二つ目の embed
タグに関しては「対応するプラグインが見つかりません。」のように表示されたままですが、今回は特に対応したりはしないことにします。
GitHub に用意しておいた test.html
から、二つ目の embed
タグは削除してあります。
サンプルの修正
ブラウザがクラッシュしないように修正します。
修正するのは plugin.cpp
内の3箇所です。
GibHub の diff が見易いのでこちらを参照した方がよいかもしれません。
- 452行目付近の
_strdup
-
以下のように、
*result
に_strdup
の結果を代入するのではなく、NPN_MemAlloc
でメモリを確保した上で*result
に代入してやります。12345- STRINGZ_TO_NPVARIANT(_strdup(
"foo return val"
), *result);
+
const
NPUTF8 *ret_str =
"foo return val"
;
+ NPUTF8 *s = (NPUTF8 *)NPN_MemAlloc(
strlen
(ret_str) + 1);
+
strcpy
(s, ret_str);
+ STRINGZ_TO_NPVARIANT(s, *result);
- 466行目付近
- こちらも、まったく同様に
_strdup
によるコピーを修正します。 - 540行目付近
-
以下のように、
NPN_Evaluate
の最後の引数に変数を渡してやり、戻り値を受け取れるようにします。
この値は不要なので、忘れずNPN_ReleaseVariantValue
で解放してやります。1234- NPN_Evaluate(m_pNPInstance, doc, &str, NULL);
+ NPVariant rval;
+ NPN_Evaluate(m_pNPInstance, doc, &str, &rval);
+ NPN_ReleaseVariantValue(&rval);
この状態でコンパイルしなおし、DLL をコピーした上で、もう一度サンプルの test.html
を閲覧すると、クラッシュせずに動作することが確認できると思います。
次回は、このサンプルにディスクサイズを取得するメソッドを追加し、もう少しサンプルの動作を説明する予定です。