记录 electron-vue 通过node ffi调用dll文件踩的坑

4,601 阅读3分钟

记录踩的坑,防止以后忘记

一些注意点

1. 需要用window电脑
2. npm容易出错,建议使用cnpm
    npm install -g cnpm --registry=https://registry.npm.taobao.org
3. 如果dll是32位的nodejs和electron都要使用对应的版本才可以使用,
4. nodejs版本建议9版本以下

拉取electron及依赖安装

// 首先安装 node-gyp
1. cnpm install node-gyp -g

// 拉取electron-vue项目
2. vue init simulatedgreg/electron-vue my-project
   // 这里我是将electron的版本改成了1.8.2在进行安装,在这个版本测试稳定,其他的没测试
   cd my-project  cnpm install

ffi安装

安装ffi之前需要的环境有4个

  1. python2.x 这里我用的是2.7版本,(3.x不支持); 安装完成以后需要将python设置为环境变量
  2. .net framework 4.5.1
  3. visual C++ Build Tools,或者 (vs2015以上(包含15))

以上三个步骤可以直接执行下面的命令进行安装

cnpm install --global --production windows-build-tools

在上面执行成功之后即可安装 node-ffi

1. cnpm install node-ffi

编译原生模块(ffi与electron用的v8版本引擎不一致)

方式1:

 分别到 ref和ffi执行下面命令
 cd .\node_modules\ref\ 和 cd .\node_modules\ffi\ 
 执行
 node-gyp rebuild --arch=ia32 --dist-url=https://atom.io/download/atom-shell --runtime=electron --target=1.8.2

--arch=ia32 : ia32表示32位,64位请改成x64,--target=1.8.2 与上面安装的electron版本一致

出现 生成代码字样表示成功

方式2

1. cnpm install -g electron-builder 
// 在项目目录下执行
2. electron-builder  install-app-deps

在根目录下创建.npmrc

# Electron 的版本。
set npm config --target=1.8.2
# Electron 的系统架构, 值为 ia32 或者 x64。
set npm config --arch=ia32
# 下载 Electron 的 headers。
set npm config --disturl=https://npm.taobao.org/mirrors/atom/
# 告诉 node-pre-gyp 我们是在为 Electron 生成模块。
set npm config --runtime=electron

ffi调用

  const ffi = require('ffi')
  const iconv = require('iconv-lite')
  const Dll =new ffi.Library('dll\\fzyktclient.dll', {
        // 第一个参数为返回值,第二个参数
       add: ['int', ['int','int', 'string']],
  })
const resBuffer= Buffer.alloc(1024);
const res=Dll.add(1,2,resBuffer)// 3
// 返回值,0代表成功
if(res===0){
// resBuffer 返回的提示信息
// 解决返回中文乱码问题
const data= const data=iconv.decode(resBuffer, 'GBK');
console.log(data)// 操作成功
}

问题解决

Q:

error msb4019:未找到导入的项目“C:\Program Files (x86 )\MSBuild\
Microsoft.Cpp\v4.0\V140\Microsoft.Cpp.Default.props”

A:

// 在命令行执行改命令即可,2017 是你当前vs对应的版本,比如你装的是2015版本,就改成2015
npm config set msvs_version 2017  

Q:

Uncaught Error: Dynamic Linking Error: Win32 error 126

A:

Dll引用的路径不对,检查路径是否书写正确,需要用绝对路径

Q:

Uncaught Error: Dynamic Linking Error: Win32 error 193

A:

dll 位数不对应,例如electron/nodejs是32位的dll是64位的

Q:

Uncaught Error: Dynamic Linking Error: Win32 error 127

A:

DLL中没有找到对应名称的函数,需要检查头文件定义的函数名是否与DLL调用时写的函数名是否相同。
Dll错误,检查你的dll文件是否还引用了其他的资源及dll文件

Q:

Uncaught Error: Dynamic Linking Error: Win32 error 1114

A:

dll初始化失败,一般是在打包成exe文件发生,可能是你的dll在打包后的位置不正确,
程序调用不到就会去系统c盘找对应的dll文件

Q:

fatail error LNK1127

A:

删除用户目录下.node-gyp 重新安装 npm install node-gyp -g

Q:

调用dll中文乱码问题

A:

// 安装iconv-lite
1.cnpm install iconv-lite -D
2.let iconv = require('iconv-lite')
3.iconv.decode(obj, 'GBK') // 解码成utf8.

Q:

打包成exe时出现
The process cannot access the file because it is being used by another process

A:

原因是程序被占用,删掉build李敏啊除icons外的文件,重新执行编译,如果还不是,则关闭编辑工具
比如vscode也会占用,然后在命令行重新编译即可

Q:

npm run build 下载包失败

A:

参考连接