Dll文件是动态链接库,桌面软件中经常需要使用。

    因为该库的调用,涉及许多工具的安装,因此不集成到框架中;但本文提供完整的安装使用说明,供大家参考。

    1:准备环境

    1. # 编译工具
    2. npm i -g node-gyp
    3. # C++构建工具
    4. 1. 管理员模式打开PowerShell
    5. 2. npm --vs2015 i -g --production windows-build-tools
    6. 或者 npm i -g --production windows-build-tools
    7. # 外部接口调用库
    8. 1. npm install ref-napi // 基本类型
    9. 2. npm install ref-array-napi // 数组类型
    10. 3. npm install ref-struct-napi // 结构体类型
    11. 4. npm install ffi-napi // 连接c代码和js代码
    12. # 编译 ref-napi 库
    13. 1. cd ./node_modules/ref-napi
    14. 2. node-gyp configure // 配置
    15. 3. node-gyp build // 编译
    1. 测试代码 ``` 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; } ```

    1. 测试使用的dll文件位置:
      1. ./build/extraResources/dll/myDllDemo.dll

    注:引用 https://blog.csdn.net/paopao_wu/article/details/107507225