网上很多关于nodejs安装ffi的模块讲的条理实在太不清晰了,nodejs使用的VC++运行库对于不同的nodejs版本是不一致的。nodejs10需要的vs版本是vs2015。
1 安装vs2015的VC环境
安装vs2015时一定要勾选编程语言VC,因为nodejs的ffi模块依赖于vc环境。
2 安装nodejs
在nodejs官网上下载nodejs10的版本,nodejs 10网址

这里下载node-v10.21.0-x86.msi
下载完成后安装nodejs
3 安装ffi环境
以管理员权限打开cmd
输入如下第一条命令:
npm install --global --production windows-build-tools

如果上面这个命令安装出错,可以采用手动安装python的方式。上面这条命令就是是安装python2.7.15,其实可以不用上面这条命令,直接在python官网上下载python-2.7.15.msi
然后手动安装python2.7,安装好了后将python2.7的路径添加到环境变量里,如果电脑上之前安装了其它python3版本,必须把其它的python3版本的环境变量移除,保证在cmd里输入python,显示的版本号是2.7.15

接下来来安装node-gyp,使用如下命令:
npm install -g node-gyp
接下来安装ffi,使用命令:
npm install ffi

接下来安装ref,使用命令:
npm install ref
经过这一步,nodejs调用dll的环境就已经全部安装完了,我们查看安装包的列表:npm list

3 nodejs使用ffi调用dll函数
当我们在上面这一步中已经是安装成功了ffi,但是使用ffi过程中却发现,提示如下错误:Cannot find module 'ffi‘
如下所示:

这是因为我们使用npm安装的第三方模块处于如下位置:

因此我们需要添加如下的环境变量:
在系统环境变量里新建变量名:

变量名:NODE_PATH
变量值:C:\Users\Administrator.SC-201908311141\node_modules
变量值就是自己电脑上安装的ffi模块所在的node_modules目录


这个时候,可见已经能够找到ffi模块了。
4 使用ffi调用dll注意的问题
当我们使用ffi调用的这个dll只是单独一个,这个dll不依赖于其它的dll,这种情况下,把dll放到程序的当前运行目录或者其它文件目录里,调用都是没问题的。
当一个dll依赖于其它dll,这种情况下需要把所有的dll都放到程序运行根目录下,这样这个dll才能找到其它dll。如果我们也要把这些dll放到一个文件夹下,该如何处理了?

使用如下代码将这些dll所在的目录添加到临时环境变量里去:
var libPath = path.join(__dirname,"./dll/");
process.env.PATH = `${process.env.PATH}${path.delimiter}${libPath}`;
下面为自己的nodejs测试工程源码:
```css
'use strict';
console.log(process.cwd())
const path = require('path');
var libPath = path.join(__dirname,"./dll/");
process.env.PATH = `${process.env.PATH}${path.delimiter}${libPath}`;
let ffi = require('ffi');
let mydll = path.join(__dirname, './dll/QR_detectTest.dll');
let dll= ffi.Library(mydll, {
'fpQR_detect': ['string', ['string']]
});
console.log(dll.fpQR_detect('./test/1.pdf'))
程序运行效果如下:

本文详细介绍了在NodeJS环境下安装FFI模块的步骤,包括安装VS2015、NodeJS10、Python2.7.15、node-gyp及FFI等依赖,解决Cannot find module 'ffi'错误,并提供了调用DLL的注意事项。
4046





