electron集成dll的几个关键点|8月更文挑战

以前作electron集成外设读卡器dll的时候,花了很多的功夫,正好今天下午须要在新电脑上从新安装一下环境,因此记录一下几个关键点。
javascript

设备

windows电脑php


安装环境软件以前考虑node版本

image.png

这里其实有三个环境,windows node版本,开发环境node npm包,生产node环境。因此这里为了打包可以顺利,咱们须要从生产环境node环境来倒推。java

  • electron版本:12.0.4
  • electron对应的node版本:14.16.0

加上dll是32位版本node

  • dll的版本:32位版本

得出windows node版本:14.16.0 32位,若是不是这样,打包会出错。由于环境上面不兼容。web


安装14.16.0 32位node

nvm安装

nvm install 14.16.0 32
nvm use 14.16.0 32 
复制代码

image.png


windows安装全局依赖

windows-build-tools

// 管理员模式安装
npm install --global --production windows-build-tools

// 上面的方式可能会卡住好久,或者一直卡住
npm install --global --production windows-build-tools@4.0.0
复制代码

node-gyps

npm install -g node-gyp
复制代码

electron-builder

npm install -g electron-builder
复制代码

项目处理

"postinstall": "electron-builder install-app-deps",
复制代码

添加这一行,会在install依赖的时候,将ffi-napi编译成electron模块,否则在打包的时候会出错。
image.png
image.png
npm

红色框表示build native模块。windows


加载dll代码

通常外设,会提供对应的dll对接说明文档,提供的通常没有electron版本,基本是java,C#,php等版本。因此咱们须要经过用js代码翻译java代码的流程逻辑。
api

稍微麻烦的是一些类型引用。bash

const ffi = require('ffi-napi');
  var ref = require('ref-napi')
  var ArrayType = require('ref-array-napi')
  var ByteArray = ArrayType(ref.types.byte)

  const myAddDll = ffi.Library('dll/mwrf32.dll', {
    'rf_init': ['int', ['short', 'long']],
    'rf_get_status': ['int', ['byte']],
    'rf_card':  ['short', ['int', 'short', ByteArray]],
    'hex_a':  ['short', [ByteArray, ByteArray, 'short']],
    'rf_beep':  ['short', ['int', 'short']],
    'rf_read_hex': ['int', ['short', 'short', ByteArray]],
    'rf_authentication': ['short', ['int', 'short', 'short']]
  })
复制代码

不少类型会用到ByteArray。这里采用下面的代码来定义类型:markdown

  var ref = require('ref-napi')
  var ArrayType = require('ref-array-napi')
  var ByteArray = ArrayType(ref.types.byte)
复制代码

常见的两个错误

  • Dynamic Linking Error: Win32 error 126:dll 路径没写对、arch 没选对、dll 引用有问题
  • Dynamic Linking Error: Win32 error 127:传参有问题、dll 没有这个函数
相关文章
相关标签/搜索