之前做electron集成外设读卡器dll的时候,花了不少的功夫,正好今天下午需要在新电脑上重新安装一下环境,所以记录一下几个关键点。
设备
windows电脑
安装环境软件之前考虑node版本
这里其实有三个环境,windows node版本,开发环境node npm包,生产node环境。所以这里为了打包能够顺利,我们需要从生产环境node环境来倒推。
- electron版本:12.0.4
- electron对应的node版本:14.16.0
加上dll是32位版本
- dll的版本:32位版本
得出windows node版本:14.16.0 32位,如果不是这样,打包会出错。因为环境上面不兼容。
安装14.16.0 32位node
nvm安装
nvm install 14.16.0 32
nvm use 14.16.0 32
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模块,不然在打包的时候会出错。
红色框表示build native模块。
加载dll代码
一般外设,会提供对应的dll对接说明文档,提供的一般没有electron版本,基本是java,C#,php等版本。所以我们需要通过用js代码翻译java代码的流程逻辑。
稍微麻烦的是一些类型引用。
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。这里采用下面的代码来定义类型:
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 没有这个函数