这期内容当中小编将会给大家带来有关怎么在Nodejs中调用Dll模块,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
有两种方案可供选择:
- <李>
方案一:使用node-ffi
李> <李>方案二:使用c++编写一个节点插件,通过LoadLibrary调用Dll
李> <强>什么是node-ffi ? 强>
node-ffi是使用纯JavaScript加载和调用动态库插件的节点,它可以用来在不写任何c++代码的情况下调用动态链接库的API接口。
ffi究竟干了什么?其实它本质上还是一个编译后的节点插件,node_modules/ffi/构建/发布/ffi_bindings。节点,ffi_bindings。节点就是一个插件ffi充当了nodejs和dll之间的桥梁。
下面是一个简单的加载dll的演示实例:
var ffi =,要求(& # 39;ffi # 39;); var libpath =, path.join (_dirname, & # 39;/test.dll& # 39;); var testLib =, ffi.Library (libpath, { ,& # 39;开始# 39;:,(& # 39;bool # 39;,, (& # 39; bool # 39;]] }); testLib.start(真正的),,//,真正的
<强>三、安装node-ffi 强>
<代码> npm安装ffi 代码>
如果本地没有安装编译节点插件的环境会报的错,如下图所示
无论是使用ffi,还是直接写节点插件,都缺少不了编译节点插件这个步骤,要编译节点插件,有两种方法:
1, node-gyp (;www.npmjs.com/package/nod ,…)。
<代码> npm安装node-gyp 代码>
具体安装参考:github.com/nodejs/node…
总结来说需要以下四点:
-3.0 python 2.7版本之间(推荐装v2.7, v3 . x。x是不支持的)
微软网络框架4.5.1
Visual c++编译工具(在windows中是不需要安装对,如果自己安装例如VS2015,导致编译报错错误MSB4132:工具版本“2.0”;是无法识别的。可用工具版本“4.0“。这个问题,说明没有装好编译器,又或者编译器没有被正确地识别,node-gyp的文档建议使用npm配置设置msvs_version 2015,但是有些机器即使这样设置了也无效,需要手动设置msvs_version,应该这样写:node-gyp重建——msvs_version=2015。如果因为安装了VS2015导致无法正常编译,可直接恢复到安装VS之前的还原点)
环境变量配置。(注:python安装位置需要添加到环境变量)
2, electron-rebuild (www.npmjs.com/package/ele…)
如果采用电子开发应用程序,电子同样也支持节点原生模块,但由于和官方的节点相比使用了不同的V8引擎,如果你想编译原生模块,则需要手动设置电子的头部的位置。
electron-rebuild为多个版本的节点和电子提供了一种简单发布预编译二进制原生模块的方法,它可以重建电子模块,识别当前电子版本,帮你自动完成了下载头,编译原生模块等步骤。一个下载electron-rebuild并重新编译的例子:
npm install ——save-dev electron-rebuild #,每次运行“npm install",时也,运行这条命令 。/node_modules/in/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) 其他# # define C_EXPORT 使用__declspec (dllimport) # endif extern “C" { typedef 才能;无效(* ReceiveCallback), (int cmd, int seq,, const char *数据);/*才能设置读取数据回调*/C_EXPORT 才能void _cdecl  SetReceiveCallback (ReceiveCallback 调); ,/* *才能设置的选择 ,*/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 *数据,unsigned int len);/*才能释放连接*/C_EXPORT 才能void _cdecl  ReleaseConnection (); } # endif怎么在Nodejs中调用Dll模块