dll找不到dll electron_如何在Electron中调用Dll

本文介绍了如何在Electron应用中调用C++和C#生成的Dll,通过ffi和edge模块实现动态链接库的功能。详细讲解了C++与C#Dll的区别,ffi调用Dll的步骤和参数类型映射,以及edge模块调用C#Dll的异步方法。同时,文章列举了在调用Dll过程中可能遇到的问题及解决办法。
摘要由CSDN通过智能技术生成

如何在Electron中调用Dll

客户端有些硬件的接口需要调试,是在电脑上连了一些硬件的设备,比如打印机、扫描仪或者进行串口通信等等。单靠JS是完成不了了,我们决定通过把C++或者C#把这些功能打包成Dll,然后在Electron客户端中通过Node调用Dll来实现所需要的功能。

Dll类型

先简单说一下什么是Dll,Dll是动态链接库文件,也是一种代码库的形式,与静态链接库相比,它是在每次程序运行的时候去调用,而静态链接库指令都会被打包到最后的exe文件里,所以如果函数有什么变化那就需要重新生成exe,那动态链接库就不需要这么做了。生成Dll可以通过VS来完成,可以选择使用C#或者C++开发,C#开发界面的比较方便,如果你的功能需要弹出一些界面,那就要用C#编写相应的Dll。不过这里要注意了,用C#语言编写生成的Dll和用C++语言编写生成的Dll是不一样的,通过C#生成的Dll需要.net的开发环境,而C++生成的Dll就没有限制。

Node如何调用Dll

Electron里调用Dll其实就是node调用Dll,刚才说了,生成的Dll不一样,那么调用方式也不一样。我是用到了这两个模块,ffi和edge,使用ffi调用C++生成的Dll,使用edge调用C#生成的Dll。ffi调用Dll

比如我这里有个ffiTest.dll的文件,里面有个导出的函数叫做joinStr,就是暴露的方法,给定两个字符串,然后会返回这两个参数的拼接结果。注意C++生成的Dll要使用C风格extern “C”否则可能找不到对应的方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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 函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值