Electron进阶(一) 调用C++库

3,596 阅读2分钟

一、基本认知

  • 什么是dll?

    动态链接库(Dynamic Link Library)DLL文件与EXE文件一样也是可执行文件,但是DLL也被称之为库,因为里面封装了各种类啊,函数啊之类的东西,就像是一个库一样,存储着很多东西,主要是用来调用的。调用方式主要分为两种:隐式(通过lib文件与头文件) 与 显式(只通过DLL文件)。

  • 为什么要使用dll?

    • 需要使用系统API操作或扩展应用程序
    • 需要调用第三方的接口API,特别是与硬件设备进行通信,而这些接口 API 基本上都是通过 C++ 动态链接库(DLL)实现的;
    • 需要调用C++实现的一些复杂算法等

二、环境配置:

  1. npm install --global windows-build-tools
    • 如果安装卡住长时间不动,可以切换镜像源,或者手动安装 python, 并自行配置环境变量
    • 详细信息可参考官网:windows-build-tools
  2. npm install -g node-gyp
    • node-gyp是一个用 Node.js 编写的跨平台命令行工具,用于为 Node.js 编译本机插件模块,如将源码形式的node modules编译成适应于本地环境的node modules等。
    • 详细信息可参考官网:node-gyp

三、主角登场 —— ffi-napi

  • 安装: npm install ffi-napi

  • 简介: node-ffi-napi是一个 Node.js 插件,用于使用纯 JavaScript 加载和调用动态库。它可用于创建与本机库的绑定,而无需编写任何 C++ 代码;简单来说,就是我们可以通过这个插件来调用dll库。

  • 如何使用:

    我也是抽空让同时帮我写了一个简单的函数(返回两数之和),并编译成32位的dll库;需要注意的是,编译的dll库需要和当前的node环境保持一致(如32的dll库在64的node环境下就会报错)

    const ffi = require('ffi-napi');
    const path = require('path');
    
    const dllPath = path.resolve(__dirname + './test_add.dll');
    
    // 'ADD' 是c++定义的函数名,数组第一个参数是返回值类型,第二个参数是入参类型
    var libm = ffi.Library(dllPath, {
        'ADD': [ 'int', [ 'int', 'int' ]]
    });
    
    let result = libm.ADD(1, 2);
    console.log(result); // 3