2012-03-08 2 views
20

node.jsアプリケーション内から特定のネイティブWindows API呼び出しにアクセスしようとしています。これを行う最善の方法は、node.jsアプリケーションで必要なノードへのネイティブ拡張/アドオンを作成し、JavaScriptから呼び出すことです。Windowsでnode.jsネイティブ拡張を作成する

この種の実行可能ファイルを実際にコンパイルする方法に関するリソースはどこにありますか?私はそれを書く方法の指示を見つけることができますが、すべてのビルド手順はLinuxのようです。私はg ++でmingwをコンパイルしても問題ないですが、Visual Studioを使う必要はありません。また、拡張機能をコンパイルするために必要なヘッダーファイルはどこにありますか?

答えて

26

私はnode-ffiとお考えします。それは簡単で、それは仕事です。

npm install ffi 
var FFI = require('ffi'); 

function TEXT(text){ 
    return new Buffer(text, 'ucs2').toString('binary'); 
} 

var user32 = new FFI.Library('user32', { 
    'MessageBoxW': [ 
     'int32', [ 'int32', 'string', 'string', 'int32' ] 
    ] 
}); 

var OK_or_Cancel = user32.MessageBoxW(
    0, TEXT('I am Node.JS!'), TEXT('Hello, World!'), 1 
); 
+0

クール、私は前にこのプロジェクトを見たことがありません。 –

+5

重要事項:* FFIコールに伴う些細なオーバーヘッドはありません。 'strtoul()'のハードコード化されたバインディングバージョンを 'strtoul()'のFFIバージョンと比較すると、ネイティブのハードコード化されたバインディングは** 5倍**高速です。より速いだけで、関数のCバージョンを使用しないでください。 * FFIの呼び出しにはかなりのコストがかかりますので、価値があります。*言い換えれば、ネイティブAPIを頻繁に呼び出す場合は問題ありませんが、多くのネイティブコールを作成する場合は、 node-ffiの重大なオーバーヘッドを避けるために、独自のaddonを作成する必要があります。 – josh3736

+0

なぜ中国語の文字が出力として表示されますか? –

14

これは現在古くなっています。今日、nannode-gypを使用して、プラットフォーム間で動作するネイティブモジュールを作成してビルドします。


私はこの痛みを自分で解決しました。 Here's a guide that helped me get it working. (PDF) NodeはWindows上で正式にサポートされているので、Visual StudioはNode on Windows用の推奨ビルドツールです。基本的には

  • Downloadとノードのソースコードをビルドします。
  • VSで新しいVC++ Win32ソリューションを作成し、その後に続くウィザードでアプリケーションタイプとしてDLLを選択します。 ATL/MFCがチェックされていないことを確認してください。
  • アドオンを作成します。例として、here's one I wrote that gets Windows' current DNS settings。具体的には、project's settings file (vcxproj)は、最も難しい部分の1つがすべてのライブラリ参照/インクルードパスの設定を取得しているので興味があります。あなたは私の設定を借りて、D:\node\をあなたのノードレポの場所に置き換えたいかもしれません。
関連する問題