使用electron 使用nodejs 的ffi模块调用dll文件 总结
1.electron 与nodejs版本不需要一致,甚至nodejs版本应该高于electron的node版本
2.要安装 Visual Studio 15 生成工具 2017 可能还需要 Visual Studio Community 2017(不确定)
3.使用electron 的node模块前要 适应化 在项目目录下 执行
set VCTargetsPath=C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\IDE\VC\VCTargets
set python=C:\Python27\python2.ex
然后在项目根目录下执行".de_modules/.bin/electron-rebuild" ".de_modules/ffi
注意 VCTargetsPath是 ffi.vcxproj配置中的$(VCTargetsPath)
例:
<Import Project="$(VCTargetsPath)\xxxx.props"/>
所以要将VCTargetsPath改为本软件中VCTargetsPath的目录
4.如果在 js报 require的错误,为main.js配置出错
5.调用dll应放入项目同级目录,而不是项目的子目录

 

 

使用sqlite3数据库
sqlite3 参考资料http://http://www.cnblogs.com/DonaHero/p/9809325.html
安装vc2015 需要用到140工具集
安装SQLiteStudio 处理数据库用的软件


修改环境变量(已经卸了vs2017装了vs2015) VCTargetsPath=C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140
cnpm install sqlite3@latest --build-from-source --runtime=electron --target=3.0.9 --dist-url=https://atom.io/download/electron --save
//target为electron版本
然后点开项目提示 缺少 node-pre-gyp 运行下面
cnpm install node-pre-gyp@latest --build-from-source --runtime=electron --target=3.0.9 --dist-url=https://atom.io/download/electron --save


但是编译完后 node_modules下的sqlite3和node-pre-gyp为快捷方式,复制后需要重新 编译sqlite3和node-pre-gyp,不知道为什么

安装玩以后 在cmd用其他npm命令会提示 要用v141平台
通过 set VCTargetsPath=C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\IDE\VC\VCTargets 命令
来提前定义 可以恢复

js使用sqlite3 创建数据库需要详细的路径
通过此来获取路径 (decodeURI 转译中文路径)
var url = decodeURI(window.document.location.pathname.substr(1).replace('index.html', ''));
db.serialize 使数据库可以并联执行,确保效率...不能保证顺序执行,需要写到内部进行回调


//electron 中html使页面随不同分辨率调整,具体参数还得按实际来调整 放入渲染进程内即可
var devInnerHeight = 1000; //开发时的InnerHeight
var devDevicePixelRatio = 1; //开发时的devicepixelratio
var devScaleFactor = 1; //开发时的ScaleFactor
var scaleFactor = require('electron').screen.getPrimaryDisplay().scaleFactor;
var zoomFactor = window.innerHeight / devInnerHeight * window.devicePixelRatio / devDevicePixelRatio * devScaleFactor / scaleFactor;
require('electron').webFrame.setZoomFactor(zoomFactor);

 

关于ffi 调用dll 可能涉及指针
客户端指静脉1:1认证
int FVC_VerifyS(char* p_enrollTemp,intp_level,int* p_result)
参数:
char* p_enrollTemp:一条注册模板数据,数据长度为960
int p_level:安全等级,设置为2即可
int*p_result:认证结果,0表示认证通过,非0认证失败
返回值
0:成功;非0:失败


客户端指静脉1:N识别
intFVC_IdentifyM(
char* p_enrollTemps,
int p_enrollTempNum,
int p_level,
int* p_resultArry,
int* p_resultNum
)
参数:
char* p_enrollTemps: N条已注册的手指静脉模板数据;
int p_enrollTempNum: N的值;
int level:认证精度级别,取值范围【0,4】,建议设置为2.
int* p_resultArry:整型数组,数组的长度为N;
resultPtr[0]的值为N条指静脉模板数据中正确匹配的第一条模板数据在N中的位置,取值范围[0,N-1];
int*p_resultNum:N条指静脉数据中正确匹配的条数,认证通过,值大于或等于1;认证失败:值为0。
返回值
0:成功;非0:失败


以下为对此的调用

var ffi= require('ffi');
const ref = require('ref');
var refArray = require('ref-array');
var Struct = require('ref-struct');
var intPtr=ref.refType('int');
var result1vMArry = Struct({
'resultPtr': refArray('byte', 8)
});
var ZN_FVC_DLL = ffi.Library('ZniFingerVeinlib', {
'FVC_VerifyS' : [ 'int', ['string','int',intPtr] ],
'FVC_IdentifyM' : [ 'int', ['string','int','int', ref.refType(result1vMArry),intPtr] ]
});
//1:N多指纹认证
var resultArry = new result1vMArry();//结构体初始化
var ret = ZN_FVC_DLL.FVC_IdentifyM(enrolTemp, enrolTemps.length,'2',resultArry.ref(),handleRef);
var buf = Buffer.from(resultArry.resultPtr); //获取已生成结构体中属性数据。
var result=buf[0];
//1:1指纹认证
var handleRef = ref.alloc('int');
var buffer=new Buffer(enrolTemp,'UTF-8');
var ret= ZN_FVC_DLL.FVC_VerifyS(buffer ,2, handleRef);
var result =handleRef.deref();//相似1 不相似0
View Code

除此之外如果用buff.toString类型,Buffer设定长度过长且不知道返回长度,其中的多余长度会转ascii码为0 的值

var serialId = new Buffer(50);
var rtn = ZN_FVC_DLL.FVC_GetDeviceInfo(serialId, firmwareId);
var str=serialId.toString();//str此时包含ascii码为0的空行,并且传统方法去不掉
使用此方法去除
//去除ASCII码的特殊字符,主要用于去除buffer转string多的空行
function getStr(str){
var result="";
for(var i = 0 ; i < str.length ; i++ ){
var tempStr = str.charCodeAt(i);
if(tempStr!=0){
result=result+String.fromCharCode(tempStr);
}
}
return result;
}
View Code

 

electron 打包
必须FQ
在package.json添加
"scripts": {
"pack": "electron-packager . Finger --win --out temp/Finger3 --arch=ia32 --app-version=1.0.0 --electron-version=3.0.10"
}
然后通过命令 npm run pack 来执行打包

 

有缺少的组件先通过npm/cnpm安装,例如下面的
set VCTargetsPath=C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\IDE\VC\VCTargets
cnpm install node-pre-gyp@latest --build-from-source --runtime=electron --target=3.0.9 --dist-url=https://atom.io/download/electron --save


记得在packjson里面添加(好像会自动加,有时候不会)
附我的

{
 "name": "cssql2",
 "version": "1.0.0",
 "description": "",
 "main": "main.js",
 "scripts": {
 "start": "electron . --enable-logging",
 "postinstall": "electron-builder install-app-deps",
"pack": "electron-packager . Finger --win --out temp/Finger3 --arch=ia32 --app-version=1.0.0 --electron-version=3.0.10"
 },
 "author": "",
 "license": "ISC",
 "dependencies": {
 "electron": "^3.0.10",
 "ffi": "^2.2.0",
 "node-pre-gyp": "^0.12.0",
 "sqlite3": "^4.0.4",
"ref-array": "^1.2.0",
"array-index": "^1.0.0",
"es6-symbol": "^3.1.1"
 },
 "devDependencies": {
 "electron-rebuild": "~1.8.2"
 }
}
View Code

 

  图标说明
"pack": "electron-packager . Finger --win --out temp --arch=ia32 --app-version=1.0.0 --electron-version=3.0.10 --icon=OEM.ico"
OEM.ico放在 Finger文件夹下
在cmd 输入 >cd /d D:\work\Electron\xxx\cs\Finger
npm run pack   
 
 
--最后记于2018-12-03 15:36
posted on 2019-04-08 11:09  黑狱  阅读(540)  评论(0编辑  收藏  举报