electron如何调用dll库(electron-vite框架)electron开发桌面软件时需要和硬件打交道,很多硬
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的文件
const ffi = require('ffi-napi')
const path = require('path')
// 用于转码
const iconv = require('iconv-lite')
let dllPath = path.resolve(__dirname, '../../resources/xxx.dll')
if (!(process.env.NODE_ENV === 'development')) {
dllPath = path
.join(__dirname, '../../resources/xxx.dll')
.replace('app.asar', 'app.asar.unpacked')
}
const dev = ffi.Library(dllPath, {
GetResult: ['int', ['char*']] // dll提供的函数接口
})
const result = Buffer.alloc(100)
result.fill(0)
const handle = dev.GetResult(result)
// 解码
const res = iconv.decode(Buffer.from(result), 'gbk').replace(/[\0,\s]/g, '')
electron-build.yml 配置
asarUnpack:
- resources/**
- '**/node_modules/ffi-napi/**/*'
- '**/node_modules/iconv-lite/**/*'
包含原生代码,不能打包进去
常见报错
凭记忆写的
-
启动程序后报126错,表示找不到dll库,请检查dll路径。
-
127错,dll有依赖其他程序或者dll,请检查dll是否依赖其他程序或者dll。
-
程序不是win32 application,检查node版本是否为32位,npm install 时是否使用32位,删去node_model,重新npm install。
其他调用dll的库
Koffi 没用过,看描述会比ffi-napi快。
其他
存在一个问题,同一功能不同硬件厂商提供的dll都不一致,通常是把这些不同的dll都打包进去,在界面上进行选择配置。这导致打包时间长,安装包大。最后参考Rubick这个开源软件,采用插件模式。ps:作者的《Electron 应用开发实践指南》写得挺好的,受益匪浅。
文章内如有错漏,请指出,多谢观看
转载自:https://juejin.cn/post/7395123504684498944