【原创】Node.js 项目使用ffi调用C和C++动态链接库,如何打包成exe
这个需求分成两部分,
(一) Node.js项目调用C和C++动态链接库,这是比较容易做到的,使用ffi库调用即可。网上能找到较多的资料。
(二)Node.js项目打包成exe,最主流的两个方案是pkg和electron packager。 两者的区别是,Electron packager一般用于图形界面的Windows程序(因为Electron是一个开发图形界面程序的框架),pkg一般用于命令行界面的Windows程序。
这两个部分单独来看,难度都还适中,找找资料都能解决。但两者要同时实现,则让我花了整整两天才研究出来。即一个Node.js程序要以exe格式发布,这个exe程序能调用C语言DLL,这种需求在网上没能找到任何一篇文章介绍,因此把我的研究成果与大家分享。
首先,我们在pkg和electron packager两个方案里面选一个。结论是选择electron packager,因为我用pkg折腾了一天的时间,最终它还是报错 Can't find native build for platform ………… ,这个问题最终也无法解决。 因此弃用pkg,转而投奔electron框架。实际上我的需求压根就不需要图形界面,但electron框架有自己的打包exe的工具,我是需要它这个工具,所以不得不选择了图形界面的electron。
所需库版本
一般来说这些版本用最新的即可,但也不排除有些库用最新版会不兼容,如果遇到问题再考虑换成我这里指定的版本。
Node.js 12.18.0 32位
Electron 9.0.5
Electron-packager 14.2.1
ffi-napi 3.0.1
.NET Framework 4.5版本以上 (Electron packager要用)
Windows PowerShell 3.0版本以上(建议用5.1版以上,Electron packager要用)
搭建Electron工程
虽然Electron是目前最火的框架之一,但IntelliJ IDEA的新建工程模板里面却没有它,不能直接在IDE里一键搭建。这里建议下载electron quick start项目,在IDE里打开
这是一个开箱即用的模板,执行npm install和npm start两条命令(什么参数都不用)即可出现一个空白的图形界面的Windows程序。使用这个模板,可以最大限度避免一开始的工程跑不起来的问题。接下来你无论改什么,都在这个模板基础上改即可。
我在研究的过程中遇到一些库被我搞坏的情况,只要把工程目录下的node_modules整个删掉,再执行npm install,就复原了。这是因为,当你从Github下载这个项目的时候,本身就没有node_modules,那些东西都是npm install命令给添加进去的。
调用DLL
在main.js中采用如下语法来调用,
const ffi = require('ffi-napi');
// 加载工程目录下的bin/Sdtapi.dll,并定义里面的函数返回类型、参数个数和类型
var myDLL = ffi.Library('bin/Sdtapi',{
'Authenticate':['int',[]] // 我这里为了测试方便,选了一个没有参数的函数
// 调用DLL里面的函数