electron集成C++ dll 實踐


#1 背景

最近需要做桌面端項目,打算嘗試使用 electron 來開發,開發之前需要調研一些可行性,最關鍵的一點是:集成公司的統一登錄 sdk,登錄的 sdk 只有 C++ sdk 才能實現單點登錄,所以這里就放棄去集成 js 的 sdk。

#2 怎么集成C++ dll

Google全網,最終放棄addons編譯那種,太過於復雜,剩下兩種方式:
第一種:node-ffi
第二種:node-ffi-napi

#3 為啥放棄node-ffi-napi這種方式

坦白說,napi 這種方式安裝啥的都很方便,調試登錄的過程中,出現的一個問題讓我放棄了這種,登錄接口需要傳入回調函數,napi 的callback有點雞肋(也可能是我沒有用好吧,從網上查閱了很多資料最終放棄了),登錄成功回調會讓 electron crash

#4 准備環境

明確一點,我們開發的是一個win32程序,x86的(32位)
所以各個版本需要對齊(electron的
安裝 Python 設置環境變量(后面遇到問題也會觸發去設置)
npm install -g node-gyp
npm install -g windows-build-tools
繼續安裝(#node-12 為了讓ffi支持node 12):
"dependencies": {
    "ffi": "github:lxe/node-ffi#node-12",
    "ref": "github:lxe/ref#node-12",
    "ref-struct": "github:lxe/ref-struct#node-12",
    "iconv-lite": "^0.5.0"
  }

  

#5 版本對齊很重要

我集成的 dll 是32位的,那么我選擇 安裝的 electron 也是 32位 win32 平台,參考 這里

npm install --arch=ia32 --platform=win32 --save-dev electron@5.0.13

#6 為什么選擇 electron@5.0.13

我使用 node-ffi 集成 C++ dll,這個庫目前支持到的 electron 就是 5.0 的版本,我是從最新的 7.x 退到 5.0 的版本才成功集成的。這期間琢磨了 1 天

#7 打包工具

這個沒啥可說的,考慮到 更新 ,選擇 electron-build 比較靠譜

npm install electron-builder --save-dev

#8 nodejs <==> C++ 參數如何傳遞

調用 C++ 的方法都會涉及到一些參數和回調函數的傳遞,nodejs 和 C++ 的通訊的消息格式顯然需要一個橋梁來轉換,這個橋梁就是 Buffer

#9 調用demo

const LID = ffi.Library("./LsfSdk.dll", {
        Init: ["int", ["string", "pointer", "pointer", "pointer"]],
        LoginByGroup: ["int", ["string", "pointer", "pointer", LoginOptionsPtr]]
      });

#10 demo 說明

1 LsfSdk.dll 就是我需要集成的 C++ 提供的登錄 SDK
2 Init,LoginByGroup 是里面的方法

#11 類型 ref ref-struct ref-array 等

nodejs 和 C 的類型需要一個轉換 ref 已經包含了大部分了,如果有結構體 需要 安裝 ref-struct,如果還有 ref 不包括的,可以繼續搜索 ref-其它的類型
可以參考 這里

#12 char* pointer 和 struct *

char* 對應 string
windows 句柄等 對應 pointer
結構體指針 需要 使用 ref-struct 在 js 里面創建 一個 struct,然后使用const LoginOptionsPtr = ref.refType(LoginOptions)  // LoginOptions 是一個struct

#13 可能出現 wchar* 或 tchar* 的亂碼問題

坦白說,這個問題困擾我很久,因為 nodejs 默認的字符串編碼就是 utf8 ,當我直接傳字符串的時候(我們的登錄 sdk 是可以定制一些參數,比如文本 按鈕顏色等),參數類型是 wchar* 或 tchar*(這個是C++里面的一個定義),類型就是 wchar* ,實際上 對應到 nodejs 里面的類型是 utf-16。所以這里安裝一個 iconv-lite 對字符串進行一次 encode 就行了

iconv.encode(str, "utf-16");

#14 結語

electron 的版本升級都伴隨一些 break changes 所以一開始選擇好版本,做好可行性的驗證很重要
如果需要集成 dll ,那么現階段 electron 選擇 5.0.13 比較合適,高版本會有很多問題無法解決。也許 node-ffi 后面會升級,能使用更新版本的 electron。
總的來說:electron 值得一試~,希望我的文章對你有幫助

原文發布在 :https://zhangxuefei.site/p/2653


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM