求助大家:由[draw.io-20.2.3-windows-no-installer.exe]缺失[ffmpeg.dll]所引发地一系列疑惑

2022-08-29 00:05:01 +08:00
 7RTDKSAK

现象 1:
1.我从 GITHUB 下载了[draw.io-20.2.3-windows-no-installer.exe],也就是便携版,双击即可运行
2.用了几天,没啥问题,昨天晚上,启动时候提醒我"ffmpeg.dll 缺失,重新安装程序可能解决此问题"
3.我一脸懵,这都用好几天了,怎么今天才突然说缺 DLL 呢?无头绪,一顿狂按回车键,居然又启动成功了?
问题 1:
程序[draw.io-20.2.3-windows-no-installer.exe]报告缺 DLL[ffmpeg.dll]后,
疑问 A:用了好几天了没问题,怎么突然缺 DLL 了?其它程序删除了 DLL?
疑问 B:可是我又没有给它补上 DLL,狂按一通回车键后,它又不缺 DLL 了?它自己连接网络后下载了?可惜现在又没有条件断网测试了(因为这一天一夜中它从来没有提示缺 DLL 了)

现象 2:
1.我搜索了一大堆解决方案,大意都差不多,让下载 ffmpeg.dll 后放到[c:\Windows\System32]和[c:\Windows\SysWOW64]中
2.但是我不想下载这些来历不明地 DLL,想找一家来自大公司并且有数字签名地 ffmpeg.dll
3.突然想到既然[draw.io-20.2.3-windows-no-installer.exe]能运行,那想必系统中已经有 ffmpeg.dll 了吧?于是全盘搜索,我滴乖乖,CLASH FOR WINDOWS/EDGE CORE/EDGE 标准版 /微信,大家的安装目录里都有 ffmpeg.dll,还有一些乱码目录里也有 ffmpeg.dll,全系统中竟然存在 62 个 ffmpeg.dll,但是[c:\Windows\System32]和[c:\Windows\SysWOW64]这俩目录中都没有 ffmpeg.dll
问题 2:
那么[draw.io-20.2.3-windows-no-installer.exe]此时(即正常运行时)到底调用了哪一个[ffmpeg.dll]呢?
A:通用且默认地搜索 DLL 地位置---即[c:\Windows\System32]和[c:\Windows\SysWOW64]这俩目录下都不存在 ffmpeg.dll
B:如果[draw.io-20.2.3-windows-no-installer.exe]和其它程序一样,自带了 ffmpeg.dll,那还能报告 ffmpeg.dll 缺失?
C:难道[draw.io-20.2.3-windows-no-installer.exe]还能借用其它程序捆绑地 ffmpeg.dll 吗?不可能吧?

现象 3:
1.印象中 EXE 会优先调用同目录下地 DLL?于是我把[c:\Program Files (x86)\Microsoft\EdgeCore\104.0.1293.70\ffmpeg.dll]复制到了[draw.io-20.2.3-windows-no-installer.exe]同目录之下,因为这个 DLL 是有微软数字签名地
2.之前用了几天,每次启动[draw.io-20.2.3-windows-no-installer.exe]的第一个实例的时候,都会弹一个窗,让选择是否新建绘图以及切换界面语言,然后才能进入绘图主工作区,以后新开地每一个实例则可以直接进入绘图主工作区
3.当把[c:\Program Files (x86)\Microsoft\EdgeCore\104.0.1293.70\ffmpeg.dll]复制到[draw.io-20.2.3-windows-no-installer.exe]同目录之后,直接就进入绘图主工作区了,哪怕是第一个实例也不会出现切换界面语言地弹窗
4.当删除[draw.io-20.2.3-windows-no-installer.exe]同目录下地 ffmpeg.dll 后,又会恢复到上述步骤 2 中所描述地行为
5.结合步骤 3 和步骤 4,是不是可以断定[draw.io-20.2.3-windows-no-installer.exe]确实调用了同目录下地[ffmpeg.dll](自 c:\Program Files (x86)\Microsoft\EdgeCore\104.0.1293.70\ffmpeg.dll 复制而来)呢?

所以请问大家,为什么会出现这些差异?
在我狂按回车键之后[draw.io-20.2.3-windows-no-installer.exe]到底调用了哪一个[ffmpeg.dll]呢?

1237 次点击
所在节点    问与答
5 条回复
Osk
2022-08-29 00:39:19 +08:00
原因不知道, 也没法帮忙试试看, 但这些信息希望有帮助:

1. draw.io 个人认为客户端版本几乎没必要使用, 用 chrome 内核的浏览器几乎可以获得相同的体验, 或者将它安装为 pwa 也行.

2. 盲猜这个客户端其实就是 electron 套壳, electron 由于有原生 API 可以调用, 比 web 会多一点点功能, 但核心的绘图功能估计几乎没区别.

3. ffmpeg 提供多媒体, 尤其是音视频的分离与解码 /编码, 可能这个库在 electron 中不算核心部件, 所以能一堆报错但能运行.

4. drawio web 版如果有暂存的绘图, 打开后不会询问放在哪里. 本地版就不清楚了, 也许你可以试试打开控制台看看.
但你说 ffmpeg.dll 会影响此行为, 那估计 electron 运行时由于不合适的 ffmpeg.dll 出现问题了(常见的话, 比如版本不匹配等问题).


建议: 重新下载安装包看看有无 ffmpeg, 或者下载历史版本的看看. 或者直接用 web 版, 安装为 pwa.

--------------

题外话: 不要啥都往 system32 或者 syswow64 扔, 网上这些教程真的是坑人, 这种关键位置是能乱放 dll 的吗... 像 ffmpeg 这种还好, 最坑的是 vc dll 都有人让人在网上随便下载的, 首先这种 dll 不是缺一个, 而是缺一套..其次...

题外话: 讨厌 electron 应用的原因之一就是太笨重, 属于是我用我不用, 给别人用我就用. /doge/
ysc3839
2022-08-29 05:55:27 +08:00
目前 Electron 似乎不能实现真正的单 exe 文件,盲猜 draw.io 的便捷版是通过自解压依赖文件实现的。所以你遇到的问题就能解释了,某次自解压时出错了或者被杀毒软件删掉了。
网上修复 DLL 缺失的方法绝大多数都是复制粘贴的,完全不考虑正确性。也不应该从别的软件中复制同名 DLL ,因为内容可能完全不同。FFmpeg 是开放源代码软件,开发者可以很自由地进行修改,并不能看见同名就认为是兼容的。
要知道一个程序运行时加载了什么 DLL ,可以用系统自带的资源监视器,或者 Process Explorer 。
Mithril
2022-08-29 09:34:45 +08:00
试了一下,它本身是个 7z 的自解压文件,运行的时候就会自动解压到 AppData\Local\Temp 里。
本身就是 Electron ,自己带了个 ffmpeg.dll
你可以清理一下 temp 文件夹试试,它自带的 ffmpeg 也没签名,按理说这个不会被杀软干掉的。
按理说它是不会调用同目录下的 ffmpeg 的,毕竟运行的实际上是解压出来的那个,而不是这个 no-installer
7RTDKSAK
2022-08-29 12:46:01 +08:00
@Osk
1.使用客户端只是因为不想依赖网络
2.确实就是 electron 套壳
3.好,以后避免下载 DLL 这种操作


@ysc3839
@Mithril
好,所以我还是下载[draw.io-20.2.3-windows-installer.exe]然后安装到某一个目录,这样比便携版更好是吧?
Osk
2022-08-30 00:53:21 +08:00
@7RTDKSAK draw.io 随便起个 http 文件服务器就能实现离线运行啦, 比应用 electron 还方便

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/876056

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX