#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 值得一試~,希望我的文章對你有幫助
