electron开发桌面软件时需要和硬件打交道,很多硬件只提供dll库供调用。过去一年做了很多electron适配硬件的东西,比如读卡,打印,纸币识别等,把一些开发经验分享给大家。
ffi-napi
,iconv-lite
等。
-
首先明确dll是32位还是64位,需要用对应32位/64位的node,安装依赖的时候(npm install)也要用对应版本node下载安装,切到32位nvm use 16 32。
-
C和JavaScript之间的类型转换
C js int/float Number char* String/Buffer 指针类型 Buffer 复杂类型,比如结构体,建议使用ref库,比如:
ref-napi
,ref-array-napi
,struct-napi
等。 -
开发环境和生产环境路径不同带来的问题。
-
electron19版本以后不支持ffi-napi请选用低版本的electron。
-
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*'
包含原生代码,不能打包进去
凭记忆写的
-
启动程序后报126错,表示找不到dll库,请检查dll路径。
-
127错,dll有依赖其他程序或者dll,请检查dll是否依赖其他程序或者dll。
-
程序不是win32 application,检查node版本是否为32位,npm install 时是否使用32位,删去node_model,重新npm install。
Koffi 没用过,看描述会比ffi-napi快。
存在一个问题,同一功能不同硬件厂商提供的dll都不一致,通常是把这些不同的dll都打包进去,在界面上进行选择配置。这导致打包时间长,安装包大。最后参考Rubick这个开源软件,采用插件模式。ps:作者的《Electron 应用开发实践指南》写得挺好的,受益匪浅。