Electron通過node-ffi調用C++dll
ffi安裝與調用
- 安裝前提條件
- 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
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']]
});
常見錯誤
- 鏈接錯誤
這一類的錯誤一般要不就是dll沒有找到要不就是dll有依賴其它的dll,可以參考錯誤編碼 - 引用錯誤,可以在模塊當中用很折模塊引用了ref,可能都要通過electron進行編譯
下載地址:http://download.csdn.net/download/liyangyang08/10163491
面對未知嘗試是我們唯一能做的事情