使用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. [Linux] umask 从三类人群的权限中拿走权限数字

      作用   umask 用来设置用户创建文件.目录的默认权限,通过从权限中拿走相应的位,格式 `umask nnn`.     理解   rwx rwx rwx 权限对应三类人群,所属人,所属组,其 ...

  2. docker swarm 集群及可视化界面的安装及配置

    docker swarm 集群及可视化界面的安装及配置 2016-12-14 16:08:46 标签:swarm consul registrator 原创作品,允许转载,转载时请务必以超链接形式标明 ...

  3. 吴裕雄 python 数据可视化

    import pandas as pd df = pd.read_csv("F:\\python3_pachongAndDatareduce\\data\\pandas data\\taob ...

  4. Unity Shader笔记

    shader “MyShader”{ Properties{ -CubeMap(“Cube Map” , Cube) = ""{这里可以添加图片渲染模式} } SubShader{ ...

  5. pytorch1.0 安装执行后报错ImportError: No module named future.utils

    File "/usr/local/lib/python2.7/dist-packages/caffe2/python/utils.py", line 10, in <modu ...

  6. LinkedHashMap 根据PUT顺序排序Map

    最近工程里面报表需要合计 , 因为所有的项都是动态的,所以只能动态添加. 思路是使用Map,初始化所有Map,然后在Map中合计并且覆盖. 使用HashMap , 初始化后所有动态项的顺序都乱了. M ...

  7. 《Orange‘s》Loader

    Loader 作用 引导扇区只有512个字节,能做的事情很少,局限性太大.所以需要一个程序,通过引导扇区加载入内存,然后将控制权交给它,这样就突破了512字节的限制.这个程序便是loader. 加载过 ...

  8. 与python的三天

    #导入海龟图 import turtleturtle.showturtle()turtle.width(20)liebiao = ['red','blue','yellow','green','pur ...

  9. I/O系统(二)

    程序查询流程1测试指令,查询IO设备是否就绪.2传送指令,当已经就绪时,执行传送功能.3转移指令,未就绪时,转移至继续测试IO设备的状态.当需要启动某一IO设备时,必须将该程序插入到现行程序中.1,由 ...

  10. TZOJ 2703 Cow Digit Game(sg博弈)

    描述 Bessie is playing a number game against Farmer John, and she wants you to help her achieve victor ...