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 沒有這個函數
相關文章
相關標籤/搜索