使用electron开发指静脉客户端遇到的问题总结
使用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
除此之外如果用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;
}
electron 打包
必须翻墙
在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"
}
}
"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
使用electron开发指静脉客户端遇到的问题总结的更多相关文章
- 使用electron开发一个h5的客户端应用创建http服务模拟后台接口mock
使用electron开发一个h5的客户端应用创建http服务模拟后端接口mock 在上一篇<electron快速开始>里讲述了如何快速的开始一个electron的应用程序,既然electr ...
- 使用Electron开发PC客户端
最近公司要求开发一个PC客户端,要求不能使用.NET开发(为了不让用户安装.net framework),所以就选择了Electron(随口听别人说了一句,之前从来没有接触过).目前项目要完毕了,所以 ...
- Vue 全家桶 + Electron 开发的一个跨三端的应用
代码地址如下:http://www.demodashi.com/demo/11738.html GitHub Repo:vue-objccn Follow: halfrost · GitHub 利用 ...
- electron 开发拆坑总结
electron 总结 前言 有一个web项目需要用客户端来包装一下 项目的主要业务都在服务器上 所以项目的大多数功能都用url 地址来访问: 客户端登陆界面在本地 打包客户端的本地登陆界面 做为登陆 ...
- 基于 SailingEase WinForm Framework 开发优秀的客户端应用程序(目录)
本系统文章将详细阐述客户端应用程序的设计理念,实现方法. 本系列文章以 SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...
- Electron-使用Electron开发第一个应用
使用Electron开发第一个应用 Electron 应用的目录结构如下: app/ ├── package.json ├── main.js └── index.html 新建一个app文件夹 将这 ...
- (转)【ASP.NET开发】获取客户端IP地址 via C#
[ASP.NET开发]获取客户端IP地址 via C# 说明:本文中的内容是我综合博客园上的博文和MSDN讨论区的资料,再通过自己的实际测试而得来,属于自己原创的内容说实话很少,写这一篇是为了记录自己 ...
- Electron开发环境部署
Electron开发环境部署 安装node.js 可以从node.js官方网站上获取安装包,并进行安装,安装完可以通过 ndoe -v 指令进行版本查看. 本文的开发环境为node.js 4.4.5. ...
- 【Electron】Electron开发入门
Electron简介: Electron提供了丰富的本地(操作系统)的API,使你能够使用纯JavaScript来创建桌面应用程序,并且跨平台(win,mac,linux等各种PC端平台).与其它各种 ...
随机推荐
- maven项目(转)
我记得在搞懂maven之前看了几次重复的maven的教学视频.不知道是自己悟性太低还是怎么滴,就是搞不清楚,现在弄清楚了,基本上入门了.写该篇博文,就是为了帮助那些和我一样对于maven迷迷糊糊的人. ...
- oralce的function处理考勤时间节点以及计算工作时间
例如: 上班时间为 8:30 到17:30,加班则到21:00:午休时间为1小时,(12:00-13:00): 晚间休息时间为半小时 (17:30-18:00),计算一批考勤数据的上班时间. 思路: ...
- Java框架spring Boot学习笔记(二):Hello Spring Boot、以及项目属性配置
新建一个新建一个SpringBootTest工程 新建一个HelloController.java文件 package com.example.demo; import org.springframe ...
- Python设计模式 - UML - 通信图(Communication Diagram)
简介 通信图表示对象之间的消息往来,是表述时序图中信息交互的另一种UML图,介绍完时序图就要对照学习一下通信图,二者是一体两面的. 通信图和时序图可以相互转换,二者的侧重点不同,通信图侧重哪些对象发送 ...
- 算法练习LeetCode初级算法之其他
位1的个数 解法一: class Solution { // you need to treat n as an unsigned value public int hammingWeight(int ...
- python验证码识别接口及识别思路代码
1,验证码识别接口代码 import json import base64 import requests def shibie(): data = {} path = "./img/&qu ...
- tp3.2 上传文件及下载文件
公共方法 UploadFile.class.php() // 开始 , , , ,];];,; ;; ::::::;,) {//文件上传失败 //捕获错误代码$this->error($file ...
- SpringMVC 使用PUT请求遇到的问题小结
最近在使用REST风格的URL进行CURD操作的学习过程中 发现使用PUT请求时候提交表单进行修改操作 报错:Request method 'PUT' not supported 在网上查找资料发现是 ...
- 安卓学习 Drawable对象
whie(!images[currentImage].endWith(".PNG")&&!images[currentImage].endWith(".p ...
- 分析easyswoole3.0源码,consoleTcpService(六)
前文讲过可以通过配置开启一个tcp服务,叫做consoleTcpservice.EasySwoole\EasySwoole\Core::83行 (new TcpService(Config::getI ...