1. 程式人生 > 其它 >Electron通過node-ffi呼叫C++dll

Electron通過node-ffi呼叫C++dll


ffi安裝與呼叫

安裝node-gyp

安裝前提條件
python(v2.7 ,3.x不支援);
visual C++ Build Tools,或者 (vs2015以上(包含15))
.net framework 4.5.1
如果是乾淨的環境可以用下面命令一鍵安裝
npm install --global --production windows-build-tools

安裝命令

npm install -g node-gyp

遇到問題

python找不到或者環境不對
檢視命令列python是否可用,如果不可用,設定path.確定命令列可用。多版本的可以參考網上相關教程進行設定
命令列可用。可以通過下面命令設定

npm config set python D:\Library\Python\Python27\python.exe


如果不行執行下面的

node-gyp configure --python v2.7.3 --verbose


node-gyp rebuild 出錯
重灌node-gyp
依次執行下面的命令

npm uninstall node-gyp -g
npm i -g windows-build-tools# 環境已用不用執行
npm install -g node-gyp
npm iconfig set python python
npm i microtime --save-dev

提示找不到系統SDK
安裝對應的SDK 或者強行設定為當前系統安裝的SDK。
node-gyp 配置錯誤
設定代理埠

--proxy=http://myproxyurl/


或者

npm config set registry http://registry.npmjs.org/

提示https超時或者異常
改用http請求

npm config set registry http://registry.npmjs.org/
npm config get registry # 確定是不是http,有時設定可能失敗,原因未知

msBuild.exe錯誤
設定vs版本

npm install --msvs_version=2013
npm install 
--msvs_version=auto #上一句不行試一下這一句

也可能是node,npm版本不匹配,可以更新一下版 本

npm install npm -g


這裡說一個強行更新版本的方式 ,找到package.json打到對應的模組更改版本號,然後執行

npm install

如果一切設定不對可以嘗試下面命令

node-gyp configure --verbose

安裝ffi 也可能叫node-ffi
前提條件要安裝node-gyp
執行命令安裝

npm install ffi

如果命令安裝不成功可能是windows沒有安裝gcc,可以下載安裝
如果還不成功可以下原始碼自己編譯安裝
原始碼地址
如果用git可以執行下面的命令

git clone git://github.com/node-ffi/node-ffi.git
cd node-ffi
node-gyp rebuild

如果上面的成功就可以把這個模組拷到node_mouduble可以直接使用。但是Electron還不行還要用Electron編譯一下
如果原始碼都無法跑通,那只有具體問題具體分析了。看看是不是沒有許可權,是不是一些關鍵的資料夾沒有建立。這時可以手動建立etc
Electron引用手動編譯的ffi
相關知識點介紹,手動編譯為第三種模式
然後可以執行下面的命令,一定要在模組當前目錄下面執行,不然會找不到bindings檔案

node-gyp rebuild --target=1.7.9 --arch=x64 --target_arch=x64 --dist-url=https://atom.io/download/electron

引數說明 target對應electron版本
arch 對應32還是64
後面的網址會下electron對應的標頭檔案,如果地址不行多嘗試,多嘗試,如果還是不行那可以考慮淘寶

https://npm.taobao.org/mirrors/atom-shell

可能遇到的問題

%1 is not a valid Win32 application
npm rm node-sass
npm install node-sass

electron重新編譯不通過可能少下面的模組,可以全域性安裝也可以僅安裝當前專案

npm install nan
npm install ref
npm install ref-array

把program.exe的錯誤可能是node.js安裝不正確或者配置不正確
vscode 擴充套件意外死亡
可能是Git擴充套件的問題,刪除一下
如果git刪除了還是不行,可能是node.js環境配置不對,我這裡出現的問題排程node.js會出這個問題,可是node.js擴充套件是整合的。所以不可能不用,所以要重置
node.js 刪除乾淨,一定要乾淨。
動態庫的呼叫
引用ffi模組和宣告對應的型別,char* 可以直接傳String

var ffi = require('node-ffi')
var ref = require('ref');
var ArrayType = require('ref-array')
var intPtr = ref.refType('int');
var floatPtr=ref.refType('float');
var float=ref.types.float;
var floatArray = ArrayType(float);

引用和指標型別的單個變數可以如下

var outNumber = ref.alloc('float');
var actualNumber = outNumber.deref();

可以像js方法一相export讓別人呼叫

exports.User32 = ffi.Library('user32', {
'GetWindowLongPtrW': ['int', ['int', 'int']],
'SetWindowLongPtrW': ['int', ['int', 'int', 'long']],
'GetSystemMenu': ['int', ['int', 'bool']],
'DestroyWindow': ['bool', ['int']]
});

陣列的相關用法可以參考這個地址
其它值型別和其它引用型別可以參考這個ref
常見錯誤
連結錯誤
這一類的錯誤一般要不就是dll沒有找到要不就是dll有依賴其它的dll,可以參考錯誤編碼
引用錯誤,可以在模組當中用很折模組引用了ref,可能都要通過electron進行編譯
下載地址:http://download.csdn.net/download/liyangyang08/10163491