electron-vue调用dll

半腔热情 提交于 2020-02-29 15:45:37

安装python2.7,一定要2.7

https://www.python.org/download/releases/2.7/

安装后设置环境变量:在环境变量path中添加C:\Python27   (python路径)

新建electron-vue项目

vue init simulatedgreg/electron-vue my-project

安装electron-rebuild

cnpm install --save-dev electron-rebuild

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

3.7.0版本稳定

cnpm install node-gyp@3.7.0 -g

安装后如何全局找不到模块就设置环境变量,path中添加C:\Users\Administrator\AppData\Roaming\npm

安装ffi

cnpm install ffi --save

在项目中导入ffi 

const ffi=require("ffi");

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

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

cmd进入node_modules/ffi目录执行如下,(速度慢就翻墙)

node-gyp rebuild -target=2.0.4  -arch=x64 -dist-url=https://atom.io/download/electron

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

如果dist-url地址下载还是很慢的话更换试试如下的地址(下面提供了2种):

https://atom.io/download/atom-shell

https://npm.taobao.org/mirrors/atom/

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

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

.\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);

打包问题

发现打包后,会出现找不到dll的问题

 

发现打包后的exe默认加载根目录的dll,而打包后的dll不知到哪儿了。。。。

不知道有什么好办法,只好使用笨方法:

首先dll路径用如下路径

 var libpath = 'termb.dll';

然后打包后再把此dll文件拖进打包后的根目录

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!