electron开发桌面软件时需要和硬件打交道,很多硬件只提供dll库供调用。过去一年做了很多electron适配硬件的东西,比如读卡,打印,纸币识别等,把一些开发经验分享给大家。

ffi-napiiconv-lite等。

  1. 首先明确dll是32位还是64位,需要用对应32位/64位的node,安装依赖的时候(npm install)也要用对应版本node下载安装,切到32位nvm use 16 32

  2. C和JavaScript之间的类型转换

    Cjs
    int/floatNumber
    char*String/Buffer
    指针类型Buffer

    复杂类型,比如结构体,建议使用ref库,比如:ref-napiref-array-napistruct-napi等。

  3. 开发环境和生产环境路径不同带来的问题。

  4. electron19版本以后不支持ffi-napi请选用低版本的electron。

  5. pnpm在下载某些库时会报错,建议使用npm或yarn作为包管理器。

采用的是electron-vite框架。

运行dll的文件

 1const ffi = require('ffi-napi')
 2const path = require('path')
 3
 4const iconv = require('iconv-lite')
 5
 6let dllPath = path.resolve(__dirname, '../../resources/xxx.dll')
 7if (!(process.env.NODE_ENV === 'development')) {
 8  dllPath = path
 9    .join(__dirname, '../../resources/xxx.dll')
10    .replace('app.asar', 'app.asar.unpacked')
11}
12
13const dev = ffi.Library(dllPath, {
14  GetResult: ['int', ['char*']] 
15})
16const result = Buffer.alloc(100)
17result.fill(0)
18const handle = dev.GetResult(result)
19
20
21const res = iconv.decode(Buffer.from(result), 'gbk').replace(/[\0,\s]/g, '')

electron-build.yml 配置

 1asarUnpack:
 2  - resources
 3  - '**/node_modules/ffi-napi*'
 4  - '**/node_modules/iconv-lite*'

包含原生代码,不能打包进去

凭记忆写的

  1. 启动程序后报126错,表示找不到dll库,请检查dll路径。

  2. 127错,dll有依赖其他程序或者dll,请检查dll是否依赖其他程序或者dll。

  3. 程序不是win32 application,检查node版本是否为32位,npm install 时是否使用32位,删去node_model,重新npm install。

Koffi 没用过,看描述会比ffi-napi快。

存在一个问题,同一功能不同硬件厂商提供的dll都不一致,通常是把这些不同的dll都打包进去,在界面上进行选择配置。这导致打包时间长,安装包大。最后参考Rubick这个开源软件,采用插件模式。ps:作者的《Electron 应用开发实践指南》写得挺好的,受益匪浅。

个人笔记记录 2021 ~ 2025