关于electron中调用dll和c++通讯

最近electron项目需要与c++进行通讯,项目是基于quasar-cli构建的electron程序。
参考文档http://nodejs.cn/api/addons.html
开始是打算在c++中调用dll动态链接库,然后将c++通过node-gyp编译成在nodejs环境中可用的.node二进制文件。此方法的具体实现可以参考https://yijiebuyi.com/blog/d401dbebf2c1f9491440f1a6fd62f6b4.html
跟着文章一步步下来,发现node-gyp编译后的.node文件只有在本地nodejs环境下可以调用,在electron集成的node环境中无法执行。项目使用的electron版本为9.4.0.在编译c++的时候也使用了

node-gyp build --target=9.4.0 --arch=x64 --dist-url=https://atom.io/download/electron

在多次尝试下放弃了,然后准备使用ffi模块直接调用dll
首先使用vs2019创建一个c++的dll项目,在pch.h文件中代理如下

#ifndef PCH_H
#define PCH_H

// 添加要在此处预编译的标头
#include "framework.h"
// 这里暴露一个myAdd的方法
extern "C" _declspec(dllexport) int myAdd(int a, int b);

#endif //PCH_H

然后在pch.cpp中写myAdd方发的具体实现,这边就做一个两个int数字的相加

// pch.cpp: 与预编译标头对应的源文件

#include "pch.h"

// 当使用预编译的头时,需要使用此源文件,编译才能成功。
#include<iostream>
// _declspec(dllexport)这里也不能少
_declspec(dllexport) int myAdd(int a, int b)
{ return a + b; }

然后就可以根据自己的程序编译成32位或者64位的dll,直接点击生成=>解决方案即可
在这里插入图片描述
然后在项目的Debug文件夹下就有我们需要的dll文件,将其复制到我们项目的目录下,为了测试方便,我这里直接将dll放到src/pages/目录下,与测试的vue文件同级目录
在这里插入图片描述
在项目中npm install fii
在测试的vue文件中js代码,mounted钩子函数中写如下代码

const ffi = require('ffi-napi')
const mydll = new ffi.Library('D:/shen/project/iremo/src/pages/MyDll.dll', {
    myAdd: ['int', ['int', 'int']]
})
this.loginForm.username = mydll.myAdd(parseInt(6), parseInt(2))

我们通过ffi.Library()方法加载dll,然后注册了dll的myAdd方法,myAdd输出类型为int,输入为2个int型
我们将这个dll计算的值复制到表单的username中,运行项目就可以看到我们需要的结果了
在这里插入图片描述

如果碰到复杂的数据,c++中会使用到指针,那么在js中如何使用c++中的指针参数,待后续再实战

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Electron 框架基于 Node.js 和 Chromium,可以使用 Node.js 的 `child_process` 模块来调用系统的 DLL 库。 首先,需要在 Electron 项目安装 `ffi` 和 `ref` 两个 Node.js 模块,用于调用 DLL 库和处理数据类型。 然后,可以使用以下代码来调用 DLL 库: ```javascript const ffi = require('ffi'); const ref = require('ref'); const path = require('path'); // 定义 DLL 函数的参数类型和返回值类型 const intPtr = ref.refType('int'); const doublePtr = ref.refType('double'); const dll = ffi.Library(path.join(__dirname, 'example.dll'), { 'add': ['int', ['int', 'int']], 'multiply': ['double', ['double', 'double', doublePtr]], 'sort': ['void', [intPtr, 'int']] }); // 调用 DLL 函数 const result1 = dll.add(1, 2); console.log(result1); // 输出 3 const result2 = ref.alloc('double'); const result3 = dll.multiply(2.5, 3.5, result2); console.log(result3, result2.deref()); // 输出 8.75 8.75 const array = [3, 1, 4, 1, 5, 9]; const buffer = Buffer.alloc(array.length * ref.sizeof.int); array.forEach((value, index) => { buffer.writeInt32LE(value, index * ref.sizeof.int); }); dll.sort(buffer, array.length); console.log(buffer); // 输出 <Buffer 01 01 03 04 05 09> ``` 在上面的代码,`ffi.Library` 函数用于加载 DLL 库,并定义 DLL 函数的参数类型和返回值类型。然后,可以使用 `dll` 对象调用 DLL 函数。注意,DLL 函数的参数和返回值类型需要与定义的类型一致,可以使用 `ref.refType` 定义指针类型,使用 `ref.alloc` 创建指针变量,使用 `deref` 方法获取指针指向的值。在调用 DLL 函数时,需要将 JavaScript 数组转换为 C 数组,可以使用 `Buffer.alloc` 创建缓冲区,使用 `writeInt32LE` 方法将数组元素写入缓冲区,然后将缓冲区的地址传递给 DLL 函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值