一、基本认知
-
什么是dll?
动态链接库(Dynamic Link Library)DLL文件与EXE文件一样也是可执行文件,但是DLL也被称之为库,因为里面封装了各种类啊,函数啊之类的东西,就像是一个库一样,存储着很多东西,主要是用来调用的。调用方式主要分为两种:隐式(通过lib文件与头文件) 与 显式(只通过DLL文件)。
-
为什么要使用dll?
- 需要使用系统API操作或扩展应用程序
- 需要调用第三方的接口API,特别是与硬件设备进行通信,而这些接口 API 基本上都是通过 C++ 动态链接库(DLL)实现的;
- 需要调用C++实现的一些复杂算法等
二、环境配置:
- npm install --global windows-build-tools
- 如果安装卡住长时间不动,可以切换镜像源,或者手动安装 python, 并自行配置环境变量
- 详细信息可参考官网:windows-build-tools
- npm install -g node-gyp
node-gyp
是一个用 Node.js 编写的跨平台命令行工具,用于为 Node.js 编译本机插件模块,如将源码形式的node modules编译成适应于本地环境的node modules等。- 详细信息可参考官网:node-gyp
三、主角登场 —— ffi-napi
-
安装: npm install ffi-napi
-
简介:
node-ffi-napi
是一个 Node.js 插件,用于使用纯 JavaScript 加载和调用动态库。它可用于创建与本机库的绑定,而无需编写任何 C++ 代码;简单来说,就是我们可以通过这个插件来调用dll库。 -
如何使用:
我也是抽空让同时帮我写了一个简单的函数(返回两数之和),并编译成32位的dll库;需要注意的是,编译的dll库需要和当前的node环境保持一致(如32的dll库在64的node环境下就会报错)
const ffi = require('ffi-napi'); const path = require('path'); const dllPath = path.resolve(__dirname + './test_add.dll'); // 'ADD' 是c++定义的函数名,数组第一个参数是返回值类型,第二个参数是入参类型 var libm = ffi.Library(dllPath, { 'ADD': [ 'int', [ 'int', 'int' ]] }); let result = libm.ADD(1, 2); console.log(result); // 3