美文网首页
记录 electron-vue 通过node ffi调用dll文

记录 electron-vue 通过node ffi调用dll文

作者: CHEN_WB | 来源:发表于2019-06-26 11:09 被阅读0次

    记录踩的坑,防止以后忘记,写的不是很详细,勿怪.

    一些注意点

    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也会占用,然后在命令行重新编译即可
    

    相关文章

      网友评论

          本文标题:记录 electron-vue 通过node ffi调用dll文

          本文链接:https://www.haomeiwen.com/subject/eygqcctx.html