Electron中调用dll

截止目前Electron的官方稳定版本已经更新到了28.1.1。我在创建Electron项目时用的28.0.0版本,后面在项目中有用到调用dll方法的需求,大致的实现就是将后端给的dll文件引入到项目中,安装ffi-napi依赖,然后进行使用。但是在ElectronV21+的时候,官方引入了V8内存隔离区,当再使用ffi-napi这个库的时候就会报错,用尽了一切办法,都未果(如果读者有解决办法可私聊)。最终还是将Electron版本降到了20.3.8。当然ffi-napi这个依赖库官方也没有及时进行维护更新,最近上一次更新已经是三年前了。

所以本篇教程是在Electron版本为20.3.8的情况下完成的,如果读者想找更高版本的教程,那可以不用读了。

一、准备阶段

你需要安装以下内容:

  1. python2
  2. npm i node-gyp
  3. npm i ffi-napi
  4. npm i -g --production windows-build-tools
  5. @electron/rebuild

如果在安装windows-build-tools时报错了,请根据报错提示信息找到对应文件夹的exe文件,手动进行安装。
在安装完@electron/rebuild之后,需要到node_modules/ffi-napi目录下 跑rebuild命令 重新编译一下。
至此,准备工作结束。

二、封装ffi-napi模块

注:调用封装好的Dll方法是在主进程中使用,通过渲染进程与主进程通信从而达到调用dll方法的效果。
新建ffi-core.js

const ffi = require('ffi-napi');
const path = require('path');let binPath = path.join(__dirname, '../binary/core_x64.dll')const bin = ffi.Library(binPath, {Client: ['string', ['string', 'string']]
})module.exports = bin

另新建 api.js

const bin = require('./ffi-core')
const { Init, Login } = require('./core') // 此文件根据自己的业务编写module.exports = {initApp: function() {return Init.Output(bin.Client(Init.Method, Init.Input('', ''))  // 调用dll方法主要在这一部分)},login: function({account, pwd}) {return Login.Output(bin.Client(Login.Method, Login.Input(account, pwd)))}
}

在preload.js中向渲染进程暴露对象:

const { contextBridge, ipcRenderer } = require('electron')contextBridge.exposeInMainWorld('service', {login: (data) => ipcRenderer.invoke('login', data),
})

在主进程中监听调用api.js中暴露的接口:
main.js

const {ipcMain} = require('electron');
const api = require('./main/api');ipcMain.handle('login', (_, data) => {return api.login(data)
})

接着,在渲染进程中使用preload.js暴露的服务:

const login = async () => {const res = await window.service.login({account: 'root',pwd: '123456789'})
}

调用登录返回的结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/340705.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ROS---激光雷达的使用

ROS—激光雷达的使用 激光雷达是现今机器人尤其是无人车领域及最重要、最关键也是最常见的传感器之一,是机器人感知外界的一种重要手段。本文将介绍在ROS下使用激光雷达传感器,我们选用的激光雷达型号为思岚A1。 使用流程如下: 硬件准备;软…

什么是集成测试?

什么是集成测试 集成测试(Integration Testing),也叫组装测试或联合测试。在单元测试的基础上,将所有模块按照设计要求(如根据结构图)组装成为子系统或系统,进行集成测试。 集成测试&#xff…

Java并发之互斥一:管程

1、简单聊聊什么是管程模型 (共享资源):定义一个共享变量,可以理解锁,令牌这类的东西(互斥访问共享资源):获取这个锁、令牌的时候是排好队的,只允许单线程访问&#xff…

大模型实战笔记04——XTuner 大模型单卡低成本微调实战

大模型实战笔记04——XTuner 大模型单卡低成本微调实战 1、Finetune简介 2、XTuner 3、8GB显存玩转LLM 4、动手实战环节 注: 笔记内容均为截图 课程视频地址:https://www.bilibili.com/video/BV1yK4y1B75J/?spm_id_from333.788&vd_source2882acf…

力扣LCR 166. 珠宝的最高价值(java 动态规划)

Problem: LCR 166. 珠宝的最高价值 文章目录 解题思路思路解题方法复杂度Code 解题思路 思路 改题目与本站64题实质上是一样的,该题目在64题的基础上将求取最小路径和改成了求取最大路径和。具体实现思路如下: 1.定义一个int类型的二维数组dp大小为给定…

C/C++ 堆排序

个人主页:仍有未知等待探索-CSDN博客 专题分栏:数据结构_仍有未知等待探索的博客-CSDN博客 欢迎大家来指教! 一、前言 今天要介绍的是堆排序。 首先什么是堆?简而言之,堆就是二叉树的数组形式,用数组来存…

MySQL中order by是怎么工作的?

在如上图中所示的explain的执行结果中,Extra字段中的“Using filesort”表示的就是需要排序,MySQL会给每个线程分配一块内存用于排序,称为sort_buffer。 索引city如上图所示 上述语句的执行流程如下: 1、初始化sort_buffer&…

e2studio开发磁力计LIS2MDL(2)----基于中断信号获取加速度数据

三轴加速度计LIS2DW12开发.2--轮基于中断信号获取加速度数据 概述视频教学样品申请源码下载新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user_uart_callback …

5个不买后悔的云服务器推荐(2024年更新)

作为多年站长使市面上大多数的云厂商的云服务器都使用过,很多特价云服务器都是新用户专享的,本文有老用户特价云服务器,阿腾云atengyun.com有多个网站、小程序等,国内头部云厂商阿里云、腾讯云、华为云、UCloud、京东云都有用过&a…

【Python基础】一文搞懂:Python 中 csv 文件的写入与读取

文章目录 1 引言2 CSV 文件简介3 Python 中的 csv 模块4 写入 CSV 文件4.1 基本用法4.2 高级用法 5 读取 CSV 文件5.1 基本用法5.2 高级用法 6 实例演示7 注意事项8 总结 1 引言 在数据处理和数据分析领域,CSV (逗号分隔值) 文件是一种常见的文件格式,用…

2.【CPP】入门(宏||内联函数||拷贝构造||析构函数||构造函数)

0x01.引言 1.实现一个宏函数ADD #define ADD(x,y) ((x)(y))//宏是预编译阶段完成替换,注意括号2.宏的优缺点 优点: 1.增强代码的复用性 2.宏函数不用建立栈帧,提高性能 缺点: 1.不方便调试 2.没有安全检查 0x02.内联函数 1.以空…

漫画演绎策略设计模式

引言 本篇主要通过一小篇漫画的形式给大家讲讲策略模式,由于策略模式本身不是很难,这里就不花太多的言辞描述了,一起看漫画吧 普通设计 从前有一个妈妈,她有一个叛逆的儿子,妈妈每天除了上下班就是要教育儿子&#…