2012-03-08 67 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的位置。