electron集成C++ dll 实践

#1 背景

最近需要做桌面端项目,打算尝试使用 electron 来开发,开发之前需要调研一些可行性,最关键的一点是:集成公司的统一登录 sdk,登录的 sdk 只有 C++ sdk 才能实现单点登录,所以这里就放弃去集成 js 的 sdk。

#2 怎么集成C++ dll

Google全网,最终放弃addons编译那种,太过于复杂,剩下两种方式:
第一种:node-ffi
第二种:node-ffi-napi

#3 为啥放弃node-ffi-napi这种方式

坦白说,napi 这种方式安装啥的都很方便,调试登录的过程中,出现的一个问题让我放弃了这种,登录接口需要传入回调函数,napi 的callback有点鸡肋(也可能是我没有用好吧,从网上查阅了很多资料最终放弃了),登录成功回调会让 electron crash

#4 准备环境

明确一点,我们开发的是一个win32程序,x86的(32位)
所以各个版本需要对齐(electron的
安装 Python 设置环境变量(后面遇到问题也会触发去设置)
npm install -g node-gyp
npm install -g windows-build-tools
继续安装(#node-12 为了让ffi支持node 12):
"dependencies": {
    "ffi": "github:lxe/node-ffi#node-12",
    "ref": "github:lxe/ref#node-12",
    "ref-struct": "github:lxe/ref-struct#node-12",
    "iconv-lite": "^0.5.0"
  }

  

#5 版本对齐很重要

我集成的 dll 是32位的,那么我选择 安装的 electron 也是 32位 win32 平台,参考 这里

npm install --arch=ia32 --platform=win32 --save-dev [email protected]

#6 为什么选择 [email protected]

我使用 node-ffi 集成 C++ dll,这个库目前支持到的 electron 就是 5.0 的版本,我是从最新的 7.x 退到 5.0 的版本才成功集成的。这期间琢磨了 1 天

#7 打包工具

这个没啥可说的,考虑到 更新 ,选择 electron-build 比较靠谱

npm install electron-builder --save-dev

#8 nodejs <==> C++ 参数如何传递

调用 C++ 的方法都会涉及到一些参数和回调函数的传递,nodejs 和 C++ 的通讯的消息格式显然需要一个桥梁来转换,这个桥梁就是 Buffer

#9 调用demo

const LID = ffi.Library("./LsfSdk.dll", {
        Init: ["int", ["string", "pointer", "pointer", "pointer"]],
        LoginByGroup: ["int", ["string", "pointer", "pointer", LoginOptionsPtr]]
      });

#10 demo 说明

1 LsfSdk.dll 就是我需要集成的 C++ 提供的登录 SDK
2 Init,LoginByGroup 是里面的方法

#11 类型 ref ref-struct ref-array 等

nodejs 和 C 的类型需要一个转换 ref 已经包含了大部分了,如果有结构体 需要 安装 ref-struct,如果还有 ref 不包括的,可以继续搜索 ref-其它的类型
可以参考 这里

#12 char* pointer 和 struct *

char* 对应 string
windows 句柄等 对应 pointer
结构体指针 需要 使用 ref-struct 在 js 里面创建 一个 struct,然后使用const LoginOptionsPtr = ref.refType(LoginOptions)  // LoginOptions 是一个struct

#13 可能出现 wchar* 或 tchar* 的乱码问题

坦白说,这个问题困扰我很久,因为 nodejs 默认的字符串编码就是 utf8 ,当我直接传字符串的时候(我们的登录 sdk 是可以定制一些参数,比如文本 按钮颜色等),参数类型是 wchar* 或 tchar*(这个是C++里面的一个定义),类型就是 wchar* ,实际上 对应到 nodejs 里面的类型是 utf-16。所以这里安装一个 iconv-lite 对字符串进行一次 encode 就行了

iconv.encode(str, "utf-16");

#14 结语

electron 的版本升级都伴随一些 break changes 所以一开始选择好版本,做好可行性的验证很重要
如果需要集成 dll ,那么现阶段 electron 选择 5.0.13 比较合适,高版本会有很多问题无法解决。也许 node-ffi 后面会升级,能使用更新版本的 electron。
总的来说:electron 值得一试~,希望我的文章对你有帮助

原文发布在 :https://zhangxuefei.site/p/2653

原文地址:https://www.cnblogs.com/mszhangxuefei/p/12163253.html

时间: 2024-10-11 16:22:51

electron集成C++ dll 实践的相关文章

美团点评:打造微服务自动化测试与持续集成工具链实践

本文内容节选自第六届全球软件案例研究峰会,时任美团点评酒旅质量团队工具链负责人王鹏老师分享的<微服务架构下的自动化测试和持续集成工具链实践>实录,重点分享:微服务架构下解决自动化测试.开发联调.测试环境.持续集成方面遇到的问题及解决方案.(PPT+文稿). 王鹏老师时任美团点评酒旅质量团队工具链负责人,在软件开发,自动化测试,研发流程改进,持续集成/交付基础设施,敏捷开发等领域有近10年的开发实施和推广经验. 编者按:2017年11月9-12日,第六届全球软件案例研究峰会在北京国家会议中心盛大

【Sentinel】sentinel 集成 apollo 最佳实践

[Sentinel]sentinel 集成 apollo 最佳实践 前言 ??在 sentinel 的控制台设置的规则信息默认都是存在内存当中的.所以无论你是重启了 sentinel 的客户端还是 sentinel 的控制台.你所设置的规则都会丢失.如果想要 sentinel 在线上环境使用,要么花钱用阿里云上的付费版本,要么自己去实现规则的持久化,如果你或你所在的公司不差钱,那么关掉这篇文章,直接用付费版吧,省掉了一大堆坑要踩.或者你是一个特立独行的人,那么我们接着往下说. ??首先说一下写这

持续集成之jenkins实践教程 基础篇 4 集成redmine

作为持续集成的利器Jenkins已经得到了广泛地应用,仅仅作为一个工具,Jenkins已然了了自己的生态圈,支持其的plugin更是超过1300+.在实际中如何使用以及如何更好地使用jenkins,一直是大家在实践并讨论的.本系列文章将会从如何使用jenkins方面对一些细节进行总结和整理,这篇文章将会介绍如何在Jenkins中实现与redmine的集成 事前准备 只要有jenkins即可,没有的可以使用Jenkins官方的镜像或者安装包,或者使用Easypack中封装的基本一致的Jenkins

electron 集成 SQLCipher

mac 安装 brew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 安装 sqlcipher brew options sqlcipher brew install sqlcipher 这部分不知道有没有起作用 export LDFLAGS="-L/usr/local/lib" export CPPFLAGS=&q

[首发]国内某大型银行的持续集成与交付实践

一.背景 随着架构的不断演进以及微服务技术在我行的深入应用,应用部署发布的复杂性大大增加,简单的代码配置管理模式.人工的版本记录及手工部署等发布操作和管理的模式,效率低.操作风险较大,因此急需从整体上提升我行软件持续交付的能力,降低应用部署发布的操作风险.通过引入构建自动化及可视化的软件交付流水线,整合从开发.构建.测试.部署.发布.运维等多个环节,加强各职能团队协助和沟通,全面实现项目构建持续自动化管理. 二.实施方法 1. 总体架构 DevOps是一组能够帮助软件开发团队极大的提高其软件交付

研发协同平台持续集成之Jenkins实践

导读 研发协同平台有两个核心目标,一是提高研发效率 ,二是提高研发质量,要实现这两个核心目标,实现持续集成是关键之一. 什么是持续集成 在<持续集成>一书中,对持续集成的定义如下:持续集成是一种软件开发实践.在持续集成中,团队成员频繁集成他们的工作成果,一般每人每天至少集成一次,也可以多次.每次集成会经过自动构建(包括自动测试)的检验,以尽快发现集成错误.自从在团队中引入这样的实践之后,Martin Fowler发现这种方法可以显著减少集成引起的问题,并可以加快团队合作软件开发的速度. 1.集

Eclipse集成Git的实践

最近一直在研究爬虫的相关技术,网上关于爬虫的教程实在是太少了,只能靠一些零零散散的博客资料做一个浅度的学习,我们已经学习了webcollector,htmlparser,Jsoup这些爬虫技术,并也成功爬取了一些网站的数据,多多少少也算是有一些小的成就,今天又学习了一下crawlScript,这是一种专门用作爬虫的一个类似script语言的爬虫技术,而且代码精简,可以用最少的代码实现强大的功能.相关技术我们下次再做介绍.今天我们要做的就是把我们最近写的一些爬虫项目上传到GitHub上. GitH

OpenStack Cinder 与各种后端存储技术的集成叙述与实践

先说下下loop设备 loop设备及losetup命令介绍 1. loop设备介绍 在类 UNIX 系统里,loop 设备是一种伪设备(pseudo-device),或者也可以说是仿真设备.它能使我们像块设备一样访问一个文件.在使用之前,一个 loop 设备必须要和一个文件进行连接.这种结合方式给用户提供了一个替代块特殊文件的接口.因此,如果这个文件包含有一个完整的文件系统,那么这个文件就可以像一个磁盘设备一样被 mount 起来.    上面说的文件格式,我们经常见到的是 CD 或 DVD 的

IBM ODM规则服务集成的最佳实践

企业IT架构中,我们通常会将规则引擎作为一个独立的服务,供企业中的不同应用消费,这也和当前一切皆服务的SOA思想吻合.那么问题来了,规则服务以什么形式部署呢?怎样和应用交互集成呢?Webservice? 好吧,这是一个标准答案,并且也是一个差不多正确的答案,但我们还有更多需要考虑的东西. 我曾在一个保险行业客户处看到这样一个设计:客户设计了一个webservice,用于定义核保的输入输出,然后定义了一个EJB服务来包装规则服务,供webservice调用,在该EJB的实现中,再调用ODM自带的E