请教 electron 调用 dll 报错的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ameizing
V2EX    Node.js

请教 electron 调用 dll 报错的问题

  •  
  •   ameizing 2024-03-12 22:41:14 +08:00 2617 次点击
    这是一个创建于 630 天前的主题,其中的信息可能已经有所发展或是发生改变。
    需求背景是用 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  
       2024-03-13 01:15:44 +08:00 via Android
    用 ffi ,高版本 electron 绕不过去,那些 fork 的 ffi 也难跑通,我项目上之前抽象的隔离,简单改了依赖就几点 koffi 了,用着还好
    dll 126 有的情况是缺失,有的情况是 32/64 的版本不对。
    coolrice1
        2
    coolrice1  
       2024-03-13 01:17:42 +08:00
    dependency walker 还是报缺 dll?
    nebel
        3
    nebel  
       2024-03-13 01:21:25 +08:00 via Android
    加我 vx:bWVuZWJlbA==
    nebel
        4
    nebel  
       2024-03-13 01:29:11 +08:00 via Android
    你以前有安装 c++的环境么,可以安装下
    有些 dll 深度依赖系统的一些 dll ,这些 dll 一般需要额外安装:
    可以搜索了先安装下: 微软 VC++运行库合集_2022.01.23
    nebel
        5
    nebel  
       2024-03-13 01:36:15 +08:00 via Android
    本地装了 git 的话,其 bin 目录下有个 ldd ,可以用 ldd xxx.dll 命令执行,然后看下 dll 依赖。
    ameizing
        6
    ameizing  
    OP
       2024-03-13 06:45:48 +08:00 via Android
    @nebel 加你啦,应该不是位数的问题,这在前面测试加法函数 dll 时踩过坑了,特意提醒对方后续编译时要给我 64 位的。
    装了 vs2017 ,这个够用吗?项目最开始在 npm install 时 node gyp 装不起来,windows-build-tools 又提示现在的 node 版本不需要它了,这才去装了 python 和 vs2017
    ameizing
        7
    ameizing  
    OP
       2024-03-13 06:47:09 +08:00 via Android
    @coolrice1 一级依赖补齐了,可能是依赖的依赖还有缺
    datadump
        8
    datadump  
       2024-03-13 08:33:39 +08:00
    qrobot
        9
    qrobot  
       2024-03-13 08:37:58 +08:00
    @ameizing 直接帮你编译 electron 可用的库, 但是只能在 main 进程调用, 如果你觉得可以, 欢迎留下微信,我帮你写好 electron 的模块你直接调用即可
    wow46687
        10
    wow46687  
       2024-03-13 09:26:17 +08:00
    @wjx0912 #8 是用的 koffi
    nomagick
        11
    nomagick  
       2024-03-13 10:13:34 +08:00
    感谢这个贴让我知道了 koffi, 连夜把祖传的 napi-ffi 给换掉了,清除了一块心病
    nevermoreluo
        12
    nevermoreluo  
       2024-03-13 11:02:04 +08:00
    我咋感觉像是厂家的锅,他们根本就没测试自己给的 dll 缺什么依赖就发你了吧。。。如果你们是甲方,联系一下产品经理,试试让厂家提供一个不在 qt 里面编译的 c++加载他们给的动态库的 demo, 他们就知道缺啥要给你啥了


    不然就你这么试。。。qt...可是有一大堆依赖的。。。不过用 qt 打外部调用的 dll 的我还是第一次见。。。可能我孤陋寡闻了吧。。。
    ameizing
        13
    ameizing  
    OP
       2024-03-13 14:48:41 +08:00 via Android
    @nevermoreluo 确实是他们的锅,但是厂家的技术水平也不是很高,今天沟通过了,他们说暂时解决不了这个依赖问题,打算改成提供 exe 给我们了。。。
    ameizing
        14
    ameizing  
    OP
       2024-03-13 14:49:23 +08:00 via Android
    @qrobot 感谢大佬提供方案,厂家改成提供 exe 给我们调用了
    ameizing
        15
    ameizing  
    OP
       2024-03-13 14:55:28 +08:00 via Android
    @nomagick 确实,ffi-napi 很久没更新了,用着慌死了,还不兼容高版本 electron
    zhangyuang
        16
    zhangyuang  
       2024-03-28 21:14:52 +08:00
    https://github.com/zhangyuang/node-ffi-rs 试试,我是作者,有问题直接提 issue ,第一时间回复
    zhangyuang
        17
    zhangyuang  
       2024-03-28 21:15:08 +08:00
    已经在腾讯内部 electron 落地了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1574 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 16:24 PVG 00:24 LAX 08:24 JFK 11:24
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86