node使用ffi-napi调用dll

1,202 阅读1分钟

参考 深入浅出 electron 的 dll 调用 - 知乎 (zhihu.com)

根据github社区的反馈,该项目已经很久没维护,在高版本环境下容易出现bug(虽然我暂时未出现),最好使用ffi-rs或者koffi代替

ffi-napi

使用 ffi-napi,你可以在 Node.js 中直接调用已编译的动态链接库(.dll 文件或者 .so 文件)。 和electron安装包类似,下载安装过程中会执行它内部配置的执行脚本, ffi-napi会进行编译。也正因为如此,需要准备编译环境。

我自己是预先建立一个测试项目进行测试,环境如下:

  • node: 18.20.4
  • Python: 3.12.5
  • Visual Studio 2022
  • node-gyp: 10.2.0
  • ffi-napi: 4.0.3
  • ref-napi: 3.0.3

公共步骤如下:

1. 准备

# NodeJS 编译 C/C++ 依赖用到 npm i -g node-gyp
npm i -g node-gyp

项目目录下配置.npmrc文件

sass_binary_site=https://registry.npmmirror.com/node-sass/

profiler_binary_host_mirror=http://registry.npmmirror.com/node-inspector/
registry=https://registry.npmmirror.com

ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/
ELECTRON_BUILDER_BINARIES_MIRROR=http://npmmirror.com/mirrors/electron-builder-binaries/

# 环境路径,请自行设置

python=C:\Users\luo25\AppData\Local\Programs\Python\Python312\python.exe
msvs_version=2022

2. 安装ffi-napi

npm i ffi-napi

3. 测试使用

新建一个文件test.js

const ffi = require('ffi-napi')
const kernel32_ffi = ffi.Library('kernel32', {
    SetDllDirectoryA: ['bool', ['string']]
})
  
console.log('kernel32_ffi',kernel32_ffi)

运行一下是否成功

node test.js

4. 在实际项目安装编译遇到的问题

  1. 缺少VC++ toolset image.png 根据报错警告,没有VC++ toolset. 打开vs安装面版进行安装

image.png 2. dll位数和node位数不一致。 报错弹出win32 193

dll由于是32位,node环境默认是64位。 可以安装32位的node,nvm切换node环境解决。