脖子上长小肉粒,Nodejs如何调用Dll模块-安博电竞APP下载ios-安博电竞app ios

电视电影明星 313℃ 0

Nodejs怎么调用Dll模块

  • 苏格团队
  • 作者:Tomey

一、为什么需求用node.js调用dll?

公司项目选用Electron( electronjs.org/ )开发pc运用,会涉及到与底层硬件设备的泰顺天气预报通讯,而脖子上长小肉粒,Nodejs怎么调用Dll模块-安博电竞APP下载ios-安博电竞app iossdk封装 基本上都是经过 C++ 动态链接库dll完成的。

有两种计划可供挑选:

  • 计划一: 运用node-fwoebotfi
  • 计划二: 运用C++编写一个node addon,经过LoadLibrary调用dll

以上两种计划都能够处理dll调用问题,计划选型要个人对C++ 的把握程度,假如了解C++开发,能够直接挑选计划二最便利。假如完全不了解C++,那么只能选用计划一。

由于笔主不太懂C++,终究挑选第一种计划。

二、什么是node-ffi?

(www.npmjs.com/package金湖论坛/ffi…

node-ffi是运用纯JavaScript加载和调用动态库的node addon,它能够用来在不写任何C++代码的情况下调用动态链接库的API 接口。

ffi终究干了什么?其实它本质上仍是一个编译后的Node addon,node_modules/ffi/build/Release/ffi_bindings.node, ffi_bindings.node便是一个addon ffi充当了nodejs和dll之间的桥梁。

下面是一个简略的加载dll的dem小年代4o实例:高尔夫轿车

var ffi = require('ffi');
var libpath = path.join(_dirname, '/test.dll');
var testLib = ffi.Library(libpath, {
'start': ['bool', ['bool']]
});
testLib.start(true); // true
仿制代码

三、装置node-ffi

npm install ffi
仿制代码

假如本地没有装置编译node addon的环境会报错,如下图所示

无论是运用ffi,仍是直接写node addon,都缺少不了编译脖子上长小肉粒,Nodejs怎么调用Dll模块-安博电竞APP下载ios-安博电竞app iosnode Addon这个进程,要编译node addon,有两种办法:

1、node-gyp(www.npmjs.com/package/nod…)。

npm install node-gyp
仿制代码

详细装置参阅:github.com/nodejs/node…

总结来说需求以下四点:

  • python 2.7-3.0版别之间 (引荐装v2.7,v3.x.x是不支撑的)
  • NET Framework 4.5.1
  • Visual C++编译东西 (在windows中是不需求装置VS,假如自己装置例如VS2015易虎臣坐牢,导致编译报错error MSB4132: The tools version "2.0" is unrecognized. Available tools versions are "4.0".这个问题,阐明没有装好编译器,又或许编译器没有被正确地辨认, node-gyp的文档主张运用npm config set msvs_version 2015, 可是有些机器即便这样设置了也无效,需求手动设置msvs_version, 应该这样写: node-gyp rebuild --msvs_version=2015。假如由于装置了VS2015导致无法正常编译,可直接康复到装置VS之前的还原点)
  • 环境变量装备。(注:python装置方位需求添加到环境变量)

2、electron-rebuild(www.npmjs.com/package/ele… )

假如选用electron开发运用程序,electron相同也支撑node原生模块,但由于和官方的node 比较运用了不同的 V8 引擎,假如你想编译原生模块,则需求手动设置electron的headers的方位。

electron-rebuild为多个版别的node和electron供给了一种简略发布预编译二进制原生模块的办法。 它能够重建electron模块,辨认当时electron版别,帮你主动完成了下载 headers、编译原生模块等进程。 一个下载 electron-rebuild 偏重新编译的比如:

npm instprofileall --save-dekittybtv electron-rebuild

# 每次运转"npm install"时,也运转这条指令
./node_modules/.bin/electron-rebuild
# 在windows下假如上述指令遇到了问题,测验这个:
.\node_modules\.bin\electron-rebuild.cmd
仿制代码

概况请看 electronjs.org/docs/tutori…

这儿需求留意nodejs版别问题,nodejs渠道有必要跟dll保持一致,相同是32位或许64位,假如两者不一致,会导致调用dll失利。

成功装置ffi模块之后,就能够开端咱们下面的ffi调用dll的实例运用。

四、运用举例

在开发需求中,需求调用根据C++编写的TCP数据转发服务的SDK。

首要咱们来看一下dll头文件接口声明的代码如下:

#ifndef JS_CONNECTION_SDK
#define JS_CONNECTION_SDK
#ifdef JS_SDK
#define C_EXPORT __declspec(dllexport)
#else
#define C_EXPORT __declspec(dllimport)
#endif
extern格拉斯哥大学 "C"
{
typedef void(*ReceiveCallback) (int cmd, int seq, const char *data);
/*设置读取数据回调*/
C_EXPORT void _cde宠妻如令cl SetReceiveCallback(ReceiveCallback callback);
/*
*设置option
*/
C_EXPORT void _cdecl SetOption(
const char* appKey,
const char* tk,
int lc,
int rm
);
/*
*创立衔接
*/
C_EXPORT bool _cdecl CreateConnection();
/*发送数据*/
C_EXPORT bool _cdecl SendData(int cmd, int seq, const char *data, unsigned int len);
/*开释衔接*/
C_EXPORT void _cdecl ReleaseConnection();
}
#endifeminem
仿制代码

ffi调用dll模块封装,代码如下:

try {
const ffi = require('ffi');
const path = require('path');
const Buffer = require('buffer').脖子上长小肉粒,Nodejs怎么调用Dll模块-安博电竞APP下载ios-安博电竞app iosBuffer;
const libpath = path.join(APP_PATH, '..', '..', '/testSDK.dll');

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

module.exports = {
createConnection: function(){
sdkLib.CreateConnecti脖子上长小肉粒,Nodejs怎么调用Dll模块-安博电竞APP下载ios-安博电竞app ioson();
},
setReceiveCallback(cb) {
global.setReceiveCallback = ffi.Callback('void', ['int', 'int', 'string'], function(cmd, seq, data){
cb && cb(cmd, seq, data && JSON.parse(data));
});
sdkLib.SetRecei泰拳王被暴头veCallback(global.setReceiveCallback);
},
sendData: function(cmd, seq, data){
data = JSON.stringify(data);
sdkL脖子上长小肉粒,Nodejs怎么调用Dll模块-安博电竞APP下载ios-安博电竞app iosib.SendData(cmd, seq, data, data.replace(/[^\\x00-\\xff]/g, '000').length, 0);
},
releaseConnection: function(){
sdkLib.ReleaseConnection();
},
setOption: function (option) {
sdkLib.SetOption(
option.appKey,
option.tk,
option.lc,
option.rm
);
}
}
} catch (error) {
log.info(error);
}
仿制代码

第一步:经过ffi注册dll接口

 const sdkLib = ffi.Library(libpath, {
香港富婆'CreateConnection': ['bool', []],
'SendData':吃醋 ['bool', ['int', 'int', 'string', 'int']],
'ReleaseConnection': ['void', []],
'SetOption': ['void', ['string'变装CD, '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,脖子上长小肉粒,Nodejs怎么调用Dll模块-安博电竞APP下载ios-安博电竞app ios能够经过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接口参数类型装备相同,这儿就不秦皇岛天气预报15天多说。

这儿需求留意一点,回调函数或许会被JavaScript废物主动收回机制收回,所以我这儿是把回调函数挂载到大局方针global上。

第二步:接口调用

经过ffi.Library(libpath, {...})注册接口,能够直经过回来的sdkLib方针调用对接的接口。例如:

var bool = sdkLib.Cre众里寻他千百度ateConnection();
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-\\脖子上长小肉粒,Nodejs怎么调用Dll模块-安博电竞APP下载ios-安博电竞app iosxff]/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);
仿制代码

文章到此结束,写这篇文章方针主要是记载自己经过node调用dll从无到有以的进程以及采坑记载,文章有误的当地,欢迎各位大佬纠正~

标签: 深圳区号vj