Dll文件是动态链接库,桌面软件中经常需要使用。
因为该库的调用,涉及许多工具的安装,因此不集成到框架中;但本文提供完整的安装使用说明,供大家参考。
# 编译工具
npm i -g node-gyp
# C++构建工具
1. 管理员模式打开PowerShell
2. npm --vs2015 i -g --production windows-build-tools
或者 npm i -g --production windows-build-tools
# 外部接口调用库
1. npm install ref-napi // 基本类型
2. npm install ref-array-napi // 数组类型
3. npm install ref-struct-napi // 结构体类型
4. npm install ffi-napi // 连接c代码和js代码
# 编译 ref-napi 库
1. cd ./node_modules/ref-napi
2. node-gyp configure // 配置
3. node-gyp build // 编译
const ffi = require('ffi-napi');
var ref = require('ref-napi');
var ArrayType = require('ref-array-napi');
/**
* exec dll file
*/
async execDll () {
// 资源路径
let dllPath = '';
const dllFile = 'myDllDemo.dll';
if (electronApp.isPackaged) {
// 打包后
dllPath = path.join(this.app.config.execDir, "resources", "extraResources", "dll", dllFile);
} else {
// 打包前
dllPath = path.join(this.app.config.execDir, "build", "extraResources", "dll", dllFile);
}
// 映射到C语言 int数组类型
var IntArray = ArrayType(ref.types.int);
// 加载 DLL文件,无需写扩展名,将DLL中的函数映射成JS方法
const MyDellDemo = new ffi.Library(dllPath, {
// 方法名必须与C函数名一致
add: [
'int', // 对应 C函数返回类型
['int', 'int'] // C函数参数列表
],
// 使用 ffi中内置类型的简写类型
addPtr: ['void', ['int', 'int', 'int*']],
// IntArray 是上面通过 ArrayType 构建出来的类型
initArray: ['void', [IntArray, 'int']]
});
// 调用add 方法
const res = MyDellDemo.add(1, 2);
console.log(`add method result of 1 + 2 is: ` + res);
// 调用addPtr 方法
// 使用Buffer类在C代码和JS代码之间实现了内存共享,让Buffer成为了C语言当中的指针。
// C函数使用指针操作函数外部的内存,所以首先需要 分配一个int类型的内存空间 第一个参数为 C语言数据类型,第二个参数为 默认值
var intBuf = ref.alloc(ref.types.int, 100);
console.log('addPtr 调用前数据>>', ref.deref(intBuf)); //获取指向的内容
MyDellDemo.addPtr(2, 2, intBuf); // 调用函数,传递指针
console.log('addPtr 调用后数据>>', ref.deref(intBuf));
// 调用initArray 方法
// IntArray 是前面使用ref-napi 和 ref-array-napi 库创建的数据类型,数组的长度为 8
// 这里一定要分配内存空间,否则 函数内的指针无法操作内存
let myArray = new IntArray(8);
MyDellDemo.initArray(myArray, 8);
console.log('初始化数组执行结果:');
for (var i = 0; i < myArray.length; i++) {
console.log(myArray[i]);
}
return true;
}
./build/extraResources/dll/myDllDemo.dll