Windowsでnixysaのサンプルプラグインをビルド

nixysaとは、Google ChromeFirefoxで独自のプログインをつくるのに必要なNPAPIをラップしたライブラリ。
これを使用することで、複雑なNPAPIプラグインの製作を楽にしてくれる。

nixysaの準備

まず、C++の開発環境であるVisual C++Python製のビルドツールscons、コードを取得するためにSubversionをインストールする。

コマンドプロンプト

svn checkout http://nixysa.googlecode.com/svn/trunk/ nixysa

とかするとnixysaソースコードが取得できる

問題はここから

VisualStudio2010を使い、付属するサンプルプラグインをビルドする際に、エラーが出る。
まず、hello_worldプラグインとcomplexプラグインで共通に出るエラー

C:\Program Files\Microsoft SDKs\Windows\v7.0A\include\winnt.h(6361) : error C2146: 構文エラー : ';' が、識別子 'ContextRecord' の前に必要です。
C:\Program Files\Microsoft SDKs\Windows\v7.0A\include\winnt.h(6361) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
C:\Program Files\Microsoft SDKs\Windows\v7.0A\include\winnt.h(6361) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
C:\Program Files\Microsoft SDKs\Windows\v7.0A\include\winnt.h(12983) : error C2065: 'PCONTEXT' : 定義されていない識別子です。

他 似たようなエラーがいっぱい

こいつはWindows.hがたりなからエラーが起きる。
だから、third_party\npapi\include\nptypes.hの41行目に

#ifndef nptypes_h_
#define nptypes_h_
#include <Windows.h>  // ←ここに追加

を追加するとcomplexプラグインは見事ビルドに成功し、npcomplex.dllが生成される。

残るは、hello_worldプラグイン
原因はおそらくVisual C++コンパイラの使用だと思う。

nixysa\nixysa\static_glue\npapi\npn_api.cc(108) : error C2589: '(' : スコープ解決演算子 (::) の右側にあるトークンは使えません。
nixysa\nixysa\static_glue\npapi\npn_api.cc(108) : error C2059: 構文エラー : '::'

このエラーを回避するために、npn_api.ccを書き換える。
問題の部分

size_t size = std::min(sizeof(g_browser_functions),
                       static_cast<size_t>(funcs->size));

こいつを

size_t size;
{
    using namespace std;
    size = min(sizeof(g_browser_functions),
                      static_cast<size_t>(funcs->size));
};

として、スコープ解決演算子 :: を書かない方法を取る。
すると、hello_worldプラグインもビルドされ、helloworld.dllが生成される。

まとめ

ビルドできたは良いが、nixysaの勉強してないから、hello_worldから見ていく