Nodejs调用Dll模块的方法(2)

const sdkLib = ffi.Library(libpath, { 'CreateConnection': ['bool', []], 'SendData': ['bool', ['int', 'int', 'string', 'int']], 'ReleaseConnection': ['void', []], 'SetOption': ['void', ['string', 'string', 'int', 'int']], 'SetReceiveCallback': ['void', ['pointer']] });

ffi.Library方法,第一个参数传入dll路径,第二参数JSON对象配置相关接口。

key对应dll头文件中输出的接口,例如C_EXPORT bool _cdecl CreateConnection();

value array配置参数类型,array[0]注册接口函数返回值类型,array[1]注册接口函数传入形参类型。

1、基础参数类型bool, char, short, int, long等。

2、指针类型,需要引入ref模块,如下:

var ref = require('ref'); var intPointer = ref.refType('char'); var doublePointer = ref.refType('short'); var charPointer = ref.refType('int'); var stringPointer = ref.refType('long'); var boolPointer = ref.refType('bool');

3、回调函数指针pointer,可以通过ffi.Callback创建,如下:

global.setReceiveCallback = ffi.Callback('void', ['int', 'int', 'string'], function(cmd, seq, data){ cb && cb(cmd, seq, data && JSON.parse(data)); }); sdkLib.SetReceiveCallback(global.setReceiveCallback);

回调函数参数类型配置与dll接口参数类型配置相同,这里就不多说。

这里需要注意一点,回调函数可能会被JavaScript垃圾自动回收机制回收,所以我这里是把回调函数挂载到全局对象global上。

第二步:接口调用

通过ffi.Library(libpath, {...})注册接口,可以直通过返回的sdkLib对象调用对接的接口。例如:

var bool = sdkLib.CreateConnection(); console.log(bool); // true or false; var cmd = 0, seq = 0, data = {...}; var dataStr = JSON.stringify(data); // JavaScript中文字符长度在C++中长度计算要*3 sdkLib.SendData(cmd, seq, data, data.replace(/[^\x00-\xff]/g, '000').length); global.setReceiveCallback = ffi.Callback('void', ['int', 'int', 'string'], function(cmd, seq, data){ cb(cmd, seq, data && JSON.parse(data)); }); sdkLib.SetReceiveCallback(global.setReceiveCallback);

补充:下面看下NodeJS通过ffi调用DLL

第一步建立一个dll, 提供方法如下

int WINAPI CAM_Open(char *pIn, char* pOut);

第二步安装ffi (前提已安装python2.x环境)

npm install --save ffi

第三步创建测试文件

var ffi = require("ffi") var DLL = ffi.Library('FaceRecognition.dll', { 'CAM_Open' : ['int', ['string', 'string']] }); var result = DLL.CAM_Open("", ""); console.log(result)

参考资料

https://github.com/node-ffi/node-ffi

总结

以上所述是小编给大家介绍的Nodejs调用Dll模块的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/f9ee5f88f514d11e4fae504e5565d82f.html