likes
comments
collection
share

electron如何调用dll库(electron-vite框架)electron开发桌面软件时需要和硬件打交道,很多硬

作者站长头像
站长
· 阅读数 17

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的文件

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/**/*'

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

常见报错

凭记忆写的

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

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

  3. 程序不是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
评论
请登录