Electron通过ffi模块调用C++动态链接库(.dll)

安装ffi模块
// 全局安装原生模块编译模块,编译ffi模块时需要用到的
cnpm i node-gyp -g
// 安装ffi模块
npm i ffi -S

这个时候, 会提示python没有安装, 需要安装python2, 怎么安装python2这个自行百度
安装好python2之后, 我们继续安装ffi模块
你会发现又报错了!!!


image.png

错误提示我们, 没有C++构建环境, 通过提示中也告诉了我们该怎么解决这个问题

  1. . 就是安装.NET Framework 2.0 。一般我们使用的windows系统本本身会自动带上.NET Framework的,只是版本可能会有所区别而已,我们可以去看看C:\Windows\Microsoft.NET\Framework目录下看看到底有没安装,安装了什么版本 ,一般来说这里不需要重新再去安装的,这一步可以省略掉
  2. 安装Microsoft Visual Studio 2005, 但是这个玩意特别大, 不想安装, 哪有没有什么替代方案呢?最后发现可以通过npm安装c++在window环境下的构建工具windows-build-tools,来解决这个问题
安装windows-build-tools
cnpm install --global --production windows-build-tools

安装好windows-build-tools让我们继续安装ffi模块, 这下总该可以了吧
不好意思!!! 又报错了.....


image.png

image.png

通过日志我们可以看出是在node-gyp rebuild的时候出错了, 唉....怎么办.....
最后发现, 这个是ffi模块的问题, 要解决这个问题, 我们需要去安装ffi的一个分支就不会报错了

安装ffi的分支
npm install ffi@gavignus/node-ffi#torycl/forceset-fix --save

成功了!!!
让我们赶紧写段代码测试一下好用不好用吧

const ffi = require("ffi");
const User32 =  ffi.Library('user32', {
                'GetWindowLongPtrW': ['int', ['int', 'int']],
                'SetWindowLongPtrW': ['int', ['int', 'int', 'long']],
                'GetSystemMenu': ['int', ['int', 'bool']],
                'DestroyWindow': ['bool', ['int']]
            })
console.log(User32.GetWindowLongPtrW); // { [Function: proxy] async: [Function] }

走到这里基本可以确认, nodejs已经成功调用dll动态链接库了
那让我们在Electron项目中调用试试吧
不好意思, 又报错了, 他m....de.....
为啥?

上面使用的是user32,这个是系统dll文件,如果不是路径形式,ffi模块就自动去系统中去寻找这个文件,我们在C:\Windows\System32和C:\Windows\SysWOW64两个路径下
发现这两个文件,分别是32位和64位的dll
那到底是使用那个文件夹下的dll呢?
这个是根据最终的运行环境确定的
Electron在使用C++模块时需要根据Electron的版本等信息重新编译一下,这样Electron中才能执行,所以我们需要进入ffi模块执行重新编译命令,并注入参数
node-gyp rebuild -target=1.8.7 -arch=x64 -dist-url=https://npm.taobao.org/mirrors/atom/
target: electron版本
arch: 计算机的架构
dist-url: 文件的下载地址,编译的时候会去这个地址下载一些额外的文件
打包运行electron, 调用dll可能还会出现问题
原因: 我们在执行npm run build的时候,是通过electron-rebuild来build的,这里没有添加参数,所有可能还会失败
解决方案:
参考electron官方的方案解决使用node原生模块, 最直接的方式就是在项目根目录添加一个npm安装配置文件.npmrc,里面包含运行需要注入的参数
.npmrc
# Electron 的版本。
set npm config --target=1.2.3
# Electron 的系统架构, 值为 ia32 或者 x64。
set npm config --arch=x64
# 下载 Electron 的 headers。
eset npm config --disturl=https://npm.taobao.org/mirrors/atom/
# 告诉 node-pre-gyp 我们是在为 Electron 生成模块。
set npm config --runtime=electron

你可能感兴趣的:(Electron通过ffi模块调用C++动态链接库(.dll))