使用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   
 
 
--最后记于2018-12-03 15:36

使用electron开发指静脉客户端遇到的问题总结的更多相关文章

  1. 使用electron开发一个h5的客户端应用创建http服务模拟后台接口mock

    使用electron开发一个h5的客户端应用创建http服务模拟后端接口mock 在上一篇<electron快速开始>里讲述了如何快速的开始一个electron的应用程序,既然electr ...

  2. 使用Electron开发PC客户端

    最近公司要求开发一个PC客户端,要求不能使用.NET开发(为了不让用户安装.net framework),所以就选择了Electron(随口听别人说了一句,之前从来没有接触过).目前项目要完毕了,所以 ...

  3. Vue 全家桶 + Electron 开发的一个跨三端的应用

    代码地址如下:http://www.demodashi.com/demo/11738.html GitHub Repo:vue-objccn Follow: halfrost · GitHub 利用 ...

  4. electron 开发拆坑总结

    electron 总结 前言 有一个web项目需要用客户端来包装一下 项目的主要业务都在服务器上 所以项目的大多数功能都用url 地址来访问: 客户端登陆界面在本地 打包客户端的本地登陆界面 做为登陆 ...

  5. 基于 SailingEase WinForm Framework 开发优秀的客户端应用程序(目录)

    本系统文章将详细阐述客户端应用程序的设计理念,实现方法. 本系列文章以  SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...

  6. Electron-使用Electron开发第一个应用

    使用Electron开发第一个应用 Electron 应用的目录结构如下: app/ ├── package.json ├── main.js └── index.html 新建一个app文件夹 将这 ...

  7. (转)【ASP.NET开发】获取客户端IP地址 via C#

    [ASP.NET开发]获取客户端IP地址 via C# 说明:本文中的内容是我综合博客园上的博文和MSDN讨论区的资料,再通过自己的实际测试而得来,属于自己原创的内容说实话很少,写这一篇是为了记录自己 ...

  8. Electron开发环境部署

    Electron开发环境部署 安装node.js 可以从node.js官方网站上获取安装包,并进行安装,安装完可以通过 ndoe -v 指令进行版本查看. 本文的开发环境为node.js 4.4.5. ...

  9. 【Electron】Electron开发入门

    Electron简介: Electron提供了丰富的本地(操作系统)的API,使你能够使用纯JavaScript来创建桌面应用程序,并且跨平台(win,mac,linux等各种PC端平台).与其它各种 ...

随机推荐

  1. 阅读rocketmq技术内幕、实战与原理杂记 - 设计

    最近正在研究rocketmq,简单记录下设计的不同 互联网系统中Rpc.服务治理.消息中间件基本都是标配,消息中间件能解耦,削峰,高可用并能间接提供达到最终一致性 消息中间件中,消息消费分为最多一次, ...

  2. REATE A STATIC WEBSITE

    REATE A STATIC WEBSITE USING JEKYLL Review Great work! Let's review what you accomplished in this un ...

  3. 创建第一个vue实例

    一.vue安装与下载 1. 官网下载  下载地址 选择开发版本 2. 打开sublime,新建vue文件夹,将下载好的代码vue.js放入vue文件夹中. 3. 新建index.html文件,在hea ...

  4. celery (二) task

    Task task 具有如下特点: task 可以在任何可调用的地方创建.它有双重角色: 定义了当task被调用时,会发送一个消息. 定义了当worker收到消息时会运行消息对应的函数 每个task都 ...

  5. 针对Oracle数据库中SCOTT方案的多表查询的一个例子

    查询出每个员工的姓名.职位.月薪.所属部门名.月薪等级及其领导的姓名.职位.所属部门名.月薪等级.select e.ename 员工姓名,e.job 员工职位,e.sal 员工月薪,d.dname 员 ...

  6. IEEE/ACM International Conference on Advances in Social Network Analysis and Mining (ASONAM) 2014 Industry Track Call for Papers

    IEEE/ACM International Conference on Advances in Social Network Analysis and Mining (ASONAM) 2014 In ...

  7. xftp无法用root账号登录问题

    编辑vim /etc/ssh/sshd_config文件 把PermitRootLogin Prohibit-password 添加#注释掉 新添加:PermitRootLogin yes 更改Per ...

  8. 视频修复工具recover_mp4,视频录制一半掉电,如何查看已保存数据?

    在生产环境中,视频通常是一种重要的文件证据,但是,如果因为各种原因,导致视频在录制到一半过程中失败, 比如:监控到一半,录制设备掉电.虽然,掉电后的视频肯定找不到,但是,有时,长时间工作生产的视频通常 ...

  9. SQL 数据开发(经典)转贴

    数据开发(经典) 1.按姓氏笔画排序: Select * From TableName Order By CustomerName Collate Chinese_PRC_Str oke_ci_as ...

  10. TFS 删除版本控制

    该文章引用至: https://www.cnblogs.com/yanjiez/p/10184845.html 1. 删除所有版本控制文件 *.vssscc  , *.vspscc 2. 修改解决方案 ...