首先要安装 node-gyp
, 用来从新编译依赖包。node
npm instal -g node-gyp
而后主要用到下面三个包:python
node-ffi -- 使用Javascript
调用动态库git
ref -- 用来定义数据类型,提供指针功能github
ref-array -- 用Buffer
来实现C语言中的 array
数据类型web
npm install ffi //这个命令会同时安装上 ref、ref-struct npm instal ref-array
要使用动态库中的函数,首先要对动态库里的函数进行声明。
好比在 Test.dll
库中,有两个函数以下:npm
void init(string name, int port); string hello(int times);
在 js
中进行声明的方法以下:数组
var ffi = require('ffi'); var Test = ffi.Library('Test.dll',{ 'init': ['void',['string','int']], 'hello': ['string', ['int']] }); #规则就是 '函数名':['返回值数据类型':['参数数据类型',...,'参数数据类型']]
声明完成后,就能够进行调用了python2.7
Test.init('COM1', 9300); Test.hello(5);
这里用简单的数据类型,来说解调用动态库的大体流程。剩下比较复杂的地方在于如何模拟像 指针
、结构体
、数组
等比较复杂的数据类型。函数
结构体须要用到'ref-struct'这个包。假设有如下结构体:visual-studio
typedef struct { byte UID[16]; /*餐盘标签 UID,16 进制*/ byte UType[6]; /*餐盘类型,10 进制*/ int ProdNo; /*菜品编码,10 进制*/ int ProdPrice; /*菜品价格,价格以分为单位,10 进制*/ } DishInfo;
int
类型的好办,能够直接使用 ref
包里含有的类型 ref.types.int
。 UID
和UType
是两个bype
类型的数组,须要使用ref-array
进行模拟。
var refStruct = require('ref-struct'); var refArray = require('ref-array'); var DishInfo = refStruct({ 'UID': refArray('byte', 16), 'UType': refArray('byte', 6), 'ProdNo': ref.types.int, 'ProdPrice': ref.types.int });
假设动态库中有函数以下, 第二个参数为结构体指针, 第三个参数是一个int
引用。
int Read(int port, DishInfo * pInfo, int &Count);
在声明函数的时候,就须要指明指针和引用的数据类型。示例以下:
var ffi = require('ffi'); var ref = require('ref'); var refStruct = require('ref-struct'); var refArray = require('ref-array'); var DishInfo = refStruct({ 'UID': refArray('byte', 16), 'UType': refArray('byte', 6), 'ProdNo': ref.types.int, 'ProdPrice': ref.types.int }); //数据类型 var intPointer = ref.refType('int'); var DishInfoArrType = refArray(DishInfo); //定义了DishInfo数组类型 var Test = ffi.Library('Test.dll',{ 'init': ['void',['string','int']], 'hello': ['string', ['int']], 'Read': ['int', ['int', DishInfoArrType, intPointer]] }); //实例化 var count = ref.alloc('int'); var DishInfoArr = DishInfoArrType(3); Test.Read(11, DishInfoArray, count); //使用deref()获取引用的实际值 var actualCount = count.deref();
使用NodeJS直接调用没问题后,就能够使用 node-gyp 编译适配 NW 的包了, 这里只说明window环境下的使用方法。
> ? [Windows Vista / 7 only] 须要安装 [.NET Framework 4.5.1](http://www.microsoft.com/en-us/download/details.aspx?id=40773)
安装 python 2.7 (不要装3.x.x,不支持),装完后运行
npm config set python python2.7
设置visualstudio版本
npm config set msvs_version 2015
打开 Github - nw.js repository, 而后切换本身使用的nw 版本分支。
我这里选择的是 nw14, 而后找到 tools/win_delay_load_hook.cc
, 下载替换掉 %APPDATA%\npm\node_modules\node-gyp\src\win_delay_load_hook.cc
# --target 输入nw 版本号,这里实用的是 v0.14.3, arch为 ia32 或者 x64 cd node_modules/ffi node-gyp configure --target=0.14.3 --arch=ia32 node-gyp build cd node_modules/ref node-gyp configure --target=0.14.3 --arch=ia32 node-gyp build