Chrome Extension でNPAPIを使うためのWindows用DLLをDebianで作る
mingwの使い方が分かってきたので、Chrome Extensionを作る。
ここにさくっと貼り付けられる量を超えたのでgithubにアップ。
https://github.com/nishimura/chrome-npapi-sample
ChromeでDLLを呼び出すExtensionを作るにあたって、ハマりどころが結構あった。
- エクスポートする関数を序数で指定するために .def ファイルが必要
- chrome://plugins で確認するために .rc ファイルが必要
- 表示されないだけじゃなく読み込まれない?かも
- バージョン情報などは .rc のものが使われるっぽい
- 文字コードの問題
- コンパイルできても動かない場合、エラーが不明
- chromeを --enable-logging --log-level=0 で起動して ログを見る
分かってしまえばあっけないんだけれども…。CソースよりもMakefileに時間がかかった。
今見返すと、拡張子が .c なのに C++ だったりコーディングスタイルが混在していたり…。Cで書きたいんだけどコンパイルオプションがよく分からず、文字コード変換もよく分からなかったので部分的にC++になってしまった。あと他の人の書いたサンプルが大抵C++だった。
取りあえず現状(commit:c9f8717)は Windowsの MessageBox を呼び出すだけ。
{ "name": "My First Extension", "version": "1.0", "manifest_version": 2, "description": "The first extension that I made.", "background": { "page": "bg.html" }, "browser_action": { "default_title": "My First Extension" }, "plugins": [ {"path": "alert.dll", "public": true} ] }
こんなmanifest.jsonを書いて
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Extension test</title> </head> <body> <embed id="alertdll" type="application/x-alert-extension" > <script src="bg.js"></script> </body> </html>
bg.htmlを書いて
chrome.browserAction.onClicked.addListener(function(tab) { var plugin = document.getElementById("alertdll"); console.log(plugin); plugin.myfunc('alphabet'); var result = plugin.myfunc('こんにちは世界!'); // call a method in your plugin console.log("my plugin returned: " + result); });
こんなJavaScriptを書いたら、Chrome拡張のアイコンを押したらWindowsのMessageBoxが実行される。
npapi.h などは mozillaからSDKをダウンロードして、その中のものをコピーして持ってきた。
コンパイルが通って動かないときやリンクに失敗するときは分からないなりに i586-mingw32msvc-objdump -p alert.dll|lv を眺めてた。
CFLAGSはVisual C++のプロジェクトサンプルからコピペ。不要なものがいくつかあると思う。
参考
サンプル: http://code.google.com/p/npapi-chrome-plugin-helloworld-example/
サンプル&リンク: http://d.hatena.ne.jp/moondial0/20100905/1283657704
文字コード: http://victreal.com/Junk/_T/index.html