V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ameizing
V2EX  ›  Node.js

请教 electron 调用 dll 报错的问题

  •  
  •   ameizing · 282 天前 · 1786 次点击
    这是一个创建于 282 天前的主题,其中的信息可能已经有所发展或是发生改变。
    需求背景是用 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 里面总是不行。

    有没有熟悉这方面的大佬说下解决问题的思路方向是什么,愿意付费咨询
    17 条回复    2024-03-28 21:15:08 +08:00
    nebel
        1
    nebel  
       282 天前 via Android
    用 ffi ,高版本 electron 绕不过去,那些 fork 的 ffi 也难跑通,我项目上之前抽象的隔离,简单改了依赖就几点 koffi 了,用着还好
    dll 126 有的情况是缺失,有的情况是 32/64 的版本不对。
    coolrice1
        2
    coolrice1  
       282 天前
    dependency walker 还是报缺 dll?
    nebel
        3
    nebel  
       282 天前 via Android
    加我 vx:bWVuZWJlbA==
    nebel
        4
    nebel  
       282 天前 via Android
    你以前有安装 c++的环境么,可以安装下
    有些 dll 深度依赖系统的一些 dll ,这些 dll 一般需要额外安装:
    可以搜索了先安装下: 微软 VC++运行库合集_2022.01.23
    nebel
        5
    nebel  
       282 天前 via Android
    本地装了 git 的话,其 bin 目录下有个 ldd ,可以用 ldd xxx.dll 命令执行,然后看下 dll 依赖。
    ameizing
        6
    ameizing  
    OP
       281 天前 via Android
    @nebel 加你啦,应该不是位数的问题,这在前面测试加法函数 dll 时踩过坑了,特意提醒对方后续编译时要给我 64 位的。
    装了 vs2017 ,这个够用吗?项目最开始在 npm install 时 node gyp 装不起来,windows-build-tools 又提示现在的 node 版本不需要它了,这才去装了 python 和 vs2017
    ameizing
        7
    ameizing  
    OP
       281 天前 via Android
    @coolrice1 一级依赖补齐了,可能是依赖的依赖还有缺
    wjx0912
        8
    wjx0912  
       281 天前
    qrobot
        9
    qrobot  
       281 天前
    @ameizing 直接帮你编译 electron 可用的库, 但是只能在 main 进程调用, 如果你觉得可以, 欢迎留下微信,我帮你写好 electron 的模块你直接调用即可
    wow46687
        10
    wow46687  
       281 天前
    @wjx0912 #8 是用的 koffi
    nomagick
        11
    nomagick  
       281 天前
    感谢这个贴让我知道了 koffi, 连夜把祖传的 napi-ffi 给换掉了,清除了一块心病
    nevermoreluo
        12
    nevermoreluo  
       281 天前
    我咋感觉像是厂家的锅,他们根本就没测试自己给的 dll 缺什么依赖就发你了吧。。。如果你们是甲方,联系一下产品经理,试试让厂家提供一个不在 qt 里面编译的 c++加载他们给的动态库的 demo, 他们就知道缺啥要给你啥了


    不然就你这么试。。。qt...可是有一大堆依赖的。。。不过用 qt 打外部调用的 dll 的我还是第一次见。。。可能我孤陋寡闻了吧。。。
    ameizing
        13
    ameizing  
    OP
       281 天前 via Android
    @nevermoreluo 确实是他们的锅,但是厂家的技术水平也不是很高,今天沟通过了,他们说暂时解决不了这个依赖问题,打算改成提供 exe 给我们了。。。
    ameizing
        14
    ameizing  
    OP
       281 天前 via Android
    @qrobot 感谢大佬提供方案,厂家改成提供 exe 给我们调用了
    ameizing
        15
    ameizing  
    OP
       281 天前 via Android
    @nomagick 确实,ffi-napi 很久没更新了,用着慌死了,还不兼容高版本 electron
    zhangyuang
        16
    zhangyuang  
       266 天前
    https://github.com/zhangyuang/node-ffi-rs 试试,我是作者,有问题直接提 issue ,第一时间回复
    zhangyuang
        17
    zhangyuang  
       266 天前
    已经在腾讯内部 electron 落地了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   988 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 21:30 · PVG 05:30 · LAX 13:30 · JFK 16:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.