2012-03-08 61 views
20

我試圖從node.js應用程序中訪問特定的本機Windows API調用。我相信最好的方法是創建一個本地擴展/附加到節點,我可以在我的node.js應用程序中要求並從JavaScript調用。在Windows上創建node.js本機擴展

從哪裏可以找到關於如何實際編譯這類可執行文件的資源?我可以找到有關如何編寫它的說明,但所有的構建說明似乎都適用於Linux。我在mingw上編譯通過g ++很好,我不需要使用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

酷,我以前從來沒見過這個項目。 – 2012-03-08 21:51:37

+5

重要提示:* FFI呼叫存在不平凡的開銷。將strtoul()的硬編碼綁定版本與strtoul()的FFI版本進行比較,可以看出,本地硬編碼綁定比**快5倍**。所以,不要僅僅因爲速度更快而使用函數的C版本。在FFI調用中有很大的代價,所以讓它們值得。*換句話說,偶爾調用本地API是很好的,但如果你打算進行大量的本地調用,那麼你將會必須編寫自己的插件來避免node-ffi的大量開銷。 – josh3736 2012-03-11 21:53:26

+0

爲什麼我會看到中文字符作爲輸出? – 2017-12-15 17:44:53

14

這現在已過時。今天,使用nannode-gyp來編寫和構建跨平臺工作的本地模塊。


我自己經歷過這種痛苦。 Here's a guide that helped me get it working. (PDF)請記住,由於Node現在在Windows上正式受支持,因此Visual Studio是Windows上Node的推薦構建工具。

基本上:

  • Download並構建節點的源代碼。 (見PDF)
  • 在VS中創建一個新的VC++ Win32解決方案,在隨後的嚮導中選擇DLL作爲應用程序類型。確保ATL/MFC未被選中。
  • 寫下你的插件。作爲例子,here's one I wrote that gets Windows' current DNS settings。特別是,project's settings file (vcxproj)將是有趣的,因爲最棘手的部分之一是獲取所有庫引用/包含路徑的設置。您可能想要借用我的配置並將D:\node\替換爲Node repo的位置。