安装python2.7(可以执行npm install --global --production windows-build-tools 一键安装所需的一些依赖)

新建electron-vue项目

vue init simulatedgreg/electron-vue my-project

安装electron-rebuild

cnpm install --save-dev electron-rebuild

全局安装原生模块编译模块,编译ffi模块时需要用到的,这里一定要安装 

cnpm install node-gyp -g

安装ffi

cnpm install ffi --save

在项目中导入ffi 

const ffi=require("ffi");

npm run dev试着运行一下会发现报错了。

electron-vue调用dll-LMLPHP

咋又作妖了呢?事实上electron在使用c++模时还需要根据electron的版本等信息重新编译一下,这样在electron中才能执行,我们需要进入ffi模块执行重新编译的命令,并注入参数。

cmd进入node_modules/ffi目录执行如下

node-gyp rebuild -target=2.0.4  -arch=x64 -dist-url=https://npm.taobao.org/mirrors/atom/

target:electron的版本号
arch : 计算机的架构(x64或者ia32),如果node环境是32位,那么这里就是ia32,如果是node环境是64位,那么这里就是x64。
dist-url :文件的下载地址,编译的时候回去这个地址上下载一些额外的文件,具体作用我不是很清楚。这里使用的是国内镜像,不是官方给出的地址,至于为什么,太慢了。

然后我们再npm run dev试着运下,发现还是报错

electron-vue调用dll-LMLPHP

这时候我们在项目根目录下需要执行如下命令:

.\node_modules\.bin\electron-rebuild.cmd

然后我们再npm run dev就成功了。

调用dll代码

 var libpath = path.join(__dirname, '/termb.dll');


     //注册dll中的接口
    //InitComm为dll中的方法名,['int',['int']]第一个int是出参类型,最后一个int所在的数组放的是入参的类型
    var testLib = ffi.Library(libpath, {
        InitComm:['int',['int']]
    });


     //调用
    const dllRet = testLib.InitComm(1001);
    console.log('ret => '+dllRet);

注意:dll如果是32 bit,那么node环境也要32位 ,如果dll是64,那么node环境也要64位;

gbk编码问题,如果调用dll返回的结果是string,需要解码

var iconv = require("iconv-lite");

var testLib = ffi.Library(libpath, {
        funcName:['int',['string','int']]
});

var buffer= Buffer.alloc(10);
var resultRen=testLib.funcName(buffer,10);
var data=iconv.decode(buffer, 'GBK');

console.log(data);
01-25 23:33