0x01。使用的npm包必须先安装node-gyp重新编译依赖包。npminstal-gnode-gyp然后主要用到以下三个包:C语言npminstallffi//这个命令会同时安装ref和ref-structnpminstalref-array0x02。要测试NODEJS调用使用动态库中的函数,首先要在动态库中声明函数。例如在Test.dll库中,有如下两个函数:voidinit(stringname,intport);字符串你好(整数倍);js中的声明方式如下:varffi=require('ffi');varTest=ffi.Library('Test.dll',{'init':['void',['string','int']],'hello':['string',['int']]});#规则是'函数名':['返回值数据类型':['参数数据类型',...,'参数数据类型']]声明完成后可以调用Test.init('COM1',9300);Test.hello(5);这里我们用简单的数据类型来说明调用动态库的大致过程。更复杂的部分是如何模拟更复杂的数据类型,如指针、结构、数组等。0x03。结构、指针和数组的转换1.结构结构需要'ref-struct'包。假设有如下结构:typedefstruct{byteUID[16];/*车牌标签UID,十六进制*/byteUType[6];/*板材类型,十进制*/intProdNo;/*菜肴编码,十进制*/intProdPrice;/*菜品价格,价格以美分为单位,小数点*/}DishInfo;int类型好办,可以直接使用ref包中包含的类型ref.types.int。UID和UType是两个bype类型数组,需要用ref-array来模拟。varrefStruct=require('ref-struct');varrefArray=require('ref-array');varDishInfo=refStruct({'UID':refArray('byte',16),'UType':refArray('byte',6),'ProdNo':ref.types.int,'ProdPrice':ref.types.int});2.指针和引用假设动态库中有如下函数,第二个参数是结构体指针,第三个参数是一个int引用。intRead(intport,DishInfo*pInfo,int&Count);声明函数时,需要指定指针和引用的数据类型。例子如下:varffi=require('ffi');varref=require('ref');varrefStruct=require('ref-struct');varrefArray=require('ref-array');varDishInfo=refStruct({'UID':refArray('byte',16),'UType':refArray('byte',6),'ProdNo':ref.types.int,'ProdPrice':ref.types.int});//数据类型varintPointer=ref.refType('int');varDishInfoArrType=refArray(DishInfo);//定义DishInfo数组类型varTest=ffi.Library('Test.dll',{'init':['void',['string','int']],'hello':['string',['int']],'Read':['int',['int',DishInfoArrType,intPointer]]});//实例化varcount=ref.alloc('int');varDishInfoArr=DishInfoArrType(3);Test.Read(11,DishInfoArray,count);//使用deref()获取引用的实际值varactualCount=count.deref();0x04.NW适配使用NodeJS直接调用后,可以使用node-gyp编译NW适配包。这里我们只讲解如何在window环境下使用。1.搭建编译环境,安装VisualStudio2015>?[仅限WindowsVista/7][.NETFramework4.5.1](http://www.microsoft.com/en-us/download/details.aspx?id=40773)安装python2.7(不要安装3.x.x,不支持),安装完成后运行npmconfigsetpythonpython2.7设置visualstudio版本npmconfigsetmsvs_version20152修改win_delay_load.cc打开Github-nw.js仓库,然后切换你使用的nw版本分支。我这里选择nw14,然后找到tools/win_delay_load_hook.cc,下载替换%APPDATA%\npm\node_modules\node-gyp\src\win_delay_load_hook.cc3。node-gyp重新编译ffi和ref#--target并输入nw这里的版本号是v0.14.3,arch是ia32或者x64cdnode_modules/ffinode-gypconfigure--target=0.14.3--arch=ia32node-gypbuildcdnode_modules/refnode-gyp配置--target=0.14.3--arch=ia32node-gypbuild0x05。参考资料在node.js中通过ffi调用动态链接库(.so/.dll文件)使用NativeNodeModulesBrazen加上自己的博客XD
