Nodejs 环境下 electron 调用 dll 报错的问题

发布于 1周前 作者 wuwangju 来自 nodejs/Nestjs

需求背景是用 electron 写个 app ,调用硬件厂家提供的 dll 和硬件通信。

一开始用 ffi-napi 加载 dll ,排除路径参数和 dll 架构位数问题后,总是报一个 native callback xxx 的错误,
查了一下得知是 electron 在 20.3.8 之后开启了一个什么内存上的限制导致,可以降级 electron 版本,
或者使用别人 fork 修改过的 ffi-napi 以及 koffi 来避免。

看到 ffi-napi 很久没更新了,就没降级 electron ,改用 koffi 加载厂家给的测试 dll ,其中只有一个 sum 函数,
成功调用。但是后续给过来硬件相关的 dll ,就总是加载失败,koffi 提示“Failed to load shared library:找不到指定的模块”,换成 fork 版本的 ffi-napi (也能正常调用 sum dll )则提示 win32 error 126 。
google 一下说是 dll 有缺失的依赖,教我用 dependency walker 看缺了什么。看了一下缺了 QT5CORE ,QT5NETWORK 这些,厂家开发说他们是用 qt5 编译的 dll ,并把缺的这些 dll 发给了我,放到了调用 dll 的同级目录下,结果还是报错。

和一个朋友讨论的时候,他用 python 的 ctypes.CDLL 就加载成功了,在 electron 里面总是不行。

有没有熟悉这方面的大佬说下解决问题的思路方向是什么,愿意付费咨询
Nodejs 环境下 electron 调用 dll 报错的问题


18 回复

用 ffi ,高版本 electron 绕不过去,那些 fork 的 ffi 也难跑通,我项目上之前抽象的隔离,简单改了依赖就几点 koffi 了,用着还好
dll 126 有的情况是缺失,有的情况是 32/64 的版本不对。


dependency walker 还是报缺 dll?

加我 vx:bWVuZWJlbA==

你以前有安装 c++的环境么,可以安装下
有些 dll 深度依赖系统的一些 dll ,这些 dll 一般需要额外安装:
可以搜索了先安装下: 微软 VC++运行库合集_2022.01.23

本地装了 git 的话,其 bin 目录下有个 ldd ,可以用 ldd xxx.dll 命令执行,然后看下 dll 依赖。

加你啦,应该不是位数的问题,这在前面测试加法函数 dll 时踩过坑了,特意提醒对方后续编译时要给我 64 位的。
装了 vs2017 ,这个够用吗?项目最开始在 npm install 时 node gyp 装不起来,windows-build-tools 又提示现在的 node 版本不需要它了,这才去装了 python 和 vs2017

一级依赖补齐了,可能是依赖的依赖还有缺

直接帮你编译 electron 可用的库, 但是只能在 main 进程调用, 如果你觉得可以, 欢迎留下微信,我帮你写好 electron 的模块你直接调用即可

#8 是用的 koffi

感谢这个贴让我知道了 koffi, 连夜把祖传的 napi-ffi 给换掉了,清除了一块心病

我咋感觉像是厂家的锅,他们根本就没测试自己给的 dll 缺什么依赖就发你了吧。。。如果你们是甲方,联系一下产品经理,试试让厂家提供一个不在 qt 里面编译的 c++加载他们给的动态库的 demo, 他们就知道缺啥要给你啥了


不然就你这么试。。。qt…可是有一大堆依赖的。。。不过用 qt 打外部调用的 dll 的我还是第一次见。。。可能我孤陋寡闻了吧。。。

确实是他们的锅,但是厂家的技术水平也不是很高,今天沟通过了,他们说暂时解决不了这个依赖问题,打算改成提供 exe 给我们了。。。

感谢大佬提供方案,厂家改成提供 exe 给我们调用了

确实,ffi-napi 很久没更新了,用着慌死了,还不兼容高版本 electron

https://github.com/zhangyuang/node-ffi-rs 试试,我是作者,有问题直接提 issue ,第一时间回复

已经在腾讯内部 electron 落地了

在 Node.js 环境下使用 Electron 调用 DLL(动态链接库)时遇到报错,通常涉及到几个关键问题:路径问题、依赖问题以及 Node.js 和 Electron 对原生模块的支持。以下是一些基本的排查步骤和示例代码,帮助你解决这个问题。

  1. 确保 DLL 路径正确: 确保你的 DLL 文件路径正确无误,并且 Electron 有权限访问该路径。你可以使用绝对路径来避免路径错误。

  2. 使用 ffi-napiref-napiffi-napiref-napi 是 Node.js 中常用的库,用于加载和调用 DLL 中的函数。

    安装依赖:

    npm install ffi-napi ref-napi
    

    示例代码:

    const ffi = require('ffi-napi');
    const ref = require('ref-napi');
    
    const myLibrary = ffi.Library('path/to/your/library.dll', {
        'YourFunctionName': ['int', ['int', 'int']] // 示例函数签名
    });
    
    const result = myLibrary.YourFunctionName(1, 2);
    console.log(result);
    
  3. 检查 Electron 版本兼容性: 确保你使用的 Electron 版本与 ffi-napiref-napi 兼容。有时候,库的更新可能会引入不兼容的更改。

  4. 调试和错误处理: 使用 try...catch 块来捕获并处理错误,这有助于你更准确地了解问题所在。

如果以上步骤仍然无法解决问题,建议查看具体的错误信息,并在相关社区或 GitHub 仓库中搜索类似的问题和解决方案。

回到顶部