前言
electron以nodejs作为底层运行环境,所以自然而然就想到了他能否调用C++编写的动态库,恰好我最近在做一个关于使用electron调用dll的项目,也就花了一点时间去了解和实践,这期间走了不少弯路,这里分享出来,希望能帮助到有遇到相关问题的小伙伴
很多刚入门不久的小伙伴第一个问题可能就是electron能不能调用DLL动态库?这里给一个明确的答复是可以的。为什么?因为electron本身就集成了nodejs运行环境,而nodejs又是用C++实现的,相当于C++是他的原配。
既然能调用,那么第二个问题来了,怎么调用?nodejs在官网也给出了方案addon有兴趣的可以看看,但是对于我们前端来说这个方案太过于复杂了,学习成本太高,如果没有c++开发背景还是另辟蹊径吧,electron是可以做到和C++混合开发的,如果团队中有C++的开发人员也可以尝试,结合C++本身的优势,开发出来的产品效果可能会更好,我们常用的IDE工具VSCode其实有部分功能也是使用C++来时实现的,这其中规避了一些electron的缺点。另一种调用DLL动态库的方案就是这里要重点介绍的模块node-ffi。
其实这个模块时用起来非常的简单,先贴一段官方使用案例,简单加了几句注释:
var ffi = require('ffi');//引入ffi模块
/*
*使用ffi模块将dll和js打通,可以把它看做是RPC(远程调用协议)
*@libm 动态库的绝对地址例如"C://plugin/test.dll"
*@ceil 动态库中方法的名称 double返回值的数据类型 ['double'] 这是函数输入参数的数据类型
*这里提一下,应为C++是是属于强类型语言这个js不同,所以这里一定要指定返回参数和输入参数的类型
*/
var libm = ffi.Library('libm', {
'ceil': [ 'double', [ 'double' ] ]
});
//通过上面的注册的libm对象来调用dll中的ceil方法
libm.ceil(1.5); // 2
这一切看起来就是这么简单,但是在这几句简单的代码后面,会让刚入门的小伙伴非常的蛋疼,因为在使用的过程中你会遇到各种问题,而且这些问题会让你对本身的目的产生动摇,目前公开的环境能够支持nodejs调用的dll的npm包好像就只有ffi,而在使用中出现的问题,貌似你尝试了所有解决问题的方案,最终还是解决不了。我自己在搞这个的时候也弄了大概一周时间,各种环境捣腾,各种测试。最后弄出来了,这里总结一下这个过程中遇见的问题,打开分为这么3点:
- 安装时报错
- 安装成功但是在运行electron时调用ffi时报错
- 打包electron时报错
安装过程中报错
//全局安装原生模块编译模块,编译ffi模块时需要用到的,这里一定要安装
npm install node-gyp -g
//安装ffi模块
npm install ffi --save
 这时安装ffi会提示Python没有安装,需要安装python,我安装的是Python2.7.13。完成之后当我兴高采烈的再去安装ffi模块,结果失望的发现下一个错误来了:
错误非常明显,就是C++的构建环境没有,后面也告诉了我们要怎么来解决:
1). 就是安装.NET Framework 2.0 。一般我们使用的windows系统本本身会自动带上.NET Framework的,只是版本可能会有所区别而已,我们可以去看看C:\Windows\Microsoft.NET\Framework目录下看看到底有没安装,安装了什么版本 ,一般来说这里不需要重新再去安装的,所以这里的第一条建议就可以忽略了。
2). 第二条建议就是安装Microsoft Visual Stu,熟悉C++开