最近electron项目需要与c++进行通讯,项目是基于quasar-cli构建的electron程序。
参考文档http://nodejs.cn/api/addons.html
开始是打算在c++中调用dll动态链接库,然后将c++通过node-gyp编译成在nodejs环境中可用的.node二进制文件。此方法的具体实现可以参考https://yijiebuyi.com/blog/d401dbebf2c1f9491440f1a6fd62f6b4.html
跟着文章一步步下来,发现node-gyp编译后的.node文件只有在本地nodejs环境下可以调用,在electron集成的node环境中无法执行。项目使用的electron版本为9.4.0.在编译c++的时候也使用了
node-gyp build --target=9.4.0 --arch=x64 --dist-url=https://atom.io/download/electron
在多次尝试下放弃了,然后准备使用ffi模块直接调用dll
首先使用vs2019创建一个c++的dll项目,在pch.h文件中代理如下
#ifndef PCH_H
#define PCH_H
// 添加要在此处预编译的标头
#include "framework.h"
// 这里暴露一个myAdd的方法
extern "C" _declspec(dllexport) int myAdd(int a, int b);
#endif //PCH_H
然后在pch.cpp中写myAdd方发的具体实现,这边就做一个两个int数字的相加
// pch.cpp: 与预编译标头对应的源文件
#include "pch.h"
// 当使用预编译的头时,需要使用此源文件,编译才能成功。
#include<iostream>
// _declspec(dllexport)这里也不能少
_declspec(dllexport) int myAdd(int a, int b)
{ return a + b; }
然后就可以根据自己的程序编译成32位或者64位的dll,直接点击生成=>解决方案即可
然后在项目的Debug文件夹下就有我们需要的dll文件,将其复制到我们项目的目录下,为了测试方便,我这里直接将dll放到src/pages/目录下,与测试的vue文件同级目录
在项目中npm install fii
在测试的vue文件中js代码,mounted钩子函数中写如下代码
const ffi = require('ffi-napi')
const mydll = new ffi.Library('D:/shen/project/iremo/src/pages/MyDll.dll', {
myAdd: ['int', ['int', 'int']]
})
this.loginForm.username = mydll.myAdd(parseInt(6), parseInt(2))
我们通过ffi.Library()方法加载dll,然后注册了dll的myAdd方法,myAdd输出类型为int,输入为2个int型
我们将这个dll计算的值复制到表单的username中,运行项目就可以看到我们需要的结果了
如果碰到复杂的数据,c++中会使用到指针,那么在js中如何使用c++中的指针参数,待后续再实战