nodejs调用dll/so文件的方法
发布于 5个月前 作者 Einsy 1245 次浏览 来自 分享

扫盲贴,高手飘过 本人之前发过一贴,关于nodejs引用dll的 http://cnodejs.org/topic/51c2ba5c73c638f3703e4185#534faa9c1969a7b22a3da918 贴文里的方法不是很优美,觉得写addon调用不完善,一直想计划写一个中间件模块出来; 考虑: 1、获得dll的所有接口函数,写成json格式文件api.json; 2、根据1得到的json格式文件api.json生成addon的c++代码addon.cc, 3、执行使用node-gyp和配置文件将addon.cc编译成addon.node【注意一定要使用vs2010,使用其他版本VS失败,不知原因】 4、调用addon.node文件里的接口函数即可;

后来才注意到有个ffi模块比较好,试了一下,不错;建议使用这个模块调用,还有更好的方法请坛友指出 例一:调用系统的user32.dll函数 MessageBoxW,有4个参数,输出一个整数 ,

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
);
console.log(OK_or_Cancel);

例二、调用当前目录下的libTest.dll,里面有一个函数factorial,输入一个整数,输出一个整数

var FFI = require('ffi');
var func = new FFI.Library('libTest', {
   'factorial': 
   [
      'int32', [ 'int32']
   ]
});

var n = func.factorial(5);
console.log(n);

三、说明 可以注意到FFI.Library的第二个参数是json,里面列出了需要用到的函数名,输入参数格式,输出结果的格式;

'int32', [ 'int32', 'string', 'string', 'int32' ]

这里就表明, (1)输出结果为整数; (2)后面的数组表示有4个参数,参数格式依次是整数,字符串,字符串,整数 ( 3 ) 字符串要转化一下才可以使用; 注意看例一; new Buffer(text, ‘ucs2’).toString(‘binary’); ffi模块同样能调用*inux 下的so文件

10 回复

顶楼主,学习了,理解中。 请问需要npm install ffi 吗?

npm install ffi 不了啊,做何解

肯定是要npm install ffi的。安装这个模块有点麻烦,需要先安装vs2010,其他版本可能不行

请分享一下swig,谢谢 @wenbob

@einsy 官网有详细的文档的。如果实在想看中文的,这里也有一些简介 http://ailuo.com/nodejs-and-swig/

@wenbob swig如何调用一个已经存在的dll文件呢? 看了文档半天没看出所以然来

@einsy swig就不是干这个事情的。swig的用法是写通用的C/C++代码,达到一次编写,到处运行的目的。如果你需要调用动态库,可以在C代码里 dlopen 什么的,总之就是用 C/C++ 语言自身的机制去实现,然后 swig 负责把你的代码包装成各种语言能使用的插件,当然这也包括 node.js 插件

回到顶部