【问题标题】:Create a node.js native extension on Windows在 Windows 上创建 node.js 原生扩展
【发布时间】:2012-03-26 08:12:21
【问题描述】:

我正在尝试从 node.js 应用程序中访问特定的本机 Windows API 调用。我认为最好的方法是创建一个本地扩展/插件到节点,我可以在我的 node.js 应用程序中需要它并从 JavaScript 调用。

我在哪里可以找到有关如何实际编译这种可执行文件的资源?我可以找到有关如何编写它的说明,但所有构建说明似乎都是针对 Linux 的。我可以在 mingw 上通过 g++ 进行编译,我不需要使用 Visual Studio。另外,我在哪里可以找到编译扩展所需的头文件?

【问题讨论】:

    标签: javascript windows node.js native add-on


    【解决方案1】:

    我认为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
    );
    

    【讨论】:

    • 酷,我以前从未见过这个项目。
    • 需要注意的重要一点:与 FFI 调用相关的开销非常重要。将strtoul() 的硬编码绑定版本与strtoul() 的 FFI 版本进行比较表明,本机硬编码绑定的速度要快 5 倍。所以不要仅仅因为它更快就使用 C 版本的函数。 FFI 调用的成本很高,所以要让它们物有所值。 换句话说,这对于偶尔调用原生 API 来说很好,但如果你要进行大量原生调用,你'你将不得不编写自己的插件以避免 node-ffi 的大量开销。
    • 为什么我看到的是汉字输出?
    【解决方案2】:

    现在已经过时了。今天,使用nannode-gyp 编写和构建跨平台工作的原生模块。


    我自己也经历过这种痛苦。 Here's a guide that helped me get it working. (PDF) 请记住,由于 Windows 现在正式支持 Node,Visual Studio 是 Windows 上 Node 的推荐构建工具。

    基本上:

    • Download 并构建 Node 源代码。 (见 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 存储库的位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-04
      • 2014-10-25
      • 2017-04-29
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多