无法仅在特定系统上加载 DLL

Posted

技术标签:

【中文标题】无法仅在特定系统上加载 DLL【英文标题】:Unable to load DLL on specific systems only 【发布时间】:2019-04-12 21:48:21 【问题描述】:

我们必须处理多台计算机上的问题,主要是 Windows 7 专业版,但最近 Windows 10 家庭版也出现了问题。 我们的软件尝试访问要使用的视频文件,该文件位于计算机上,并抛出错误:

无法加载 DLL 'EvrPresenter32.dll':指定的模块可以 找不到。 (来自 HRESULT 的异常:0x8007007E) System.DllNotFoundException:无法加载 DLL 'EvrPresenter32.dll': 指定的模块无法找到。 (HRESULT 的例外情况: 0x8007007E)

调用函数时似乎会发生这种情况:Presentation.Windows.Controls.DirectShow.EvrPresenter.DllGetClassObject32(Guid, Guid, Object&)

但是,EvrPresenter32.dll 存在于它应该存在的软件目录中,就像一切正常的计算机一样。 任何视频格式(.wmv、.mp4、.avi...)或视频访问路径都会发生这种情况。

我们尝试使用 regsrv32.exe 手动注册 C:\Windows\sysWOW64\ 中的 .dll,但这会报错:

模块 EvrPresenter32.dll 加载失败。确保二进制文件是 存储在指定路径或对其进行调试以检查是否存在问题 二进制或相关的 .DLL 文件。指定的模块不能是 找到了。

驱动程序是最新的。 系统是最新的。

您能否给我们一些提示来调查和解决这个问题?

【问题讨论】:

“或依赖的 .DLL 文件” - 您可能想查看 Dependency Walker 以查看是否有 EvrPresenter32.dll 链接到但没有链接的任何库现在。 这是 DirectShow 的包装器,用 C++/CLI 编写。它对vcruntime140.dll有依赖,容易忽略。 support.microsoft.com/en-us/help/2977003/… @WaiHaLee :我们已经对此进行了检查,这是一个很好的调查点。可悲的是,Dependency Walker 在每个系统上显示大约 500 个缺失的 DDL,无论是否正常工作。缺少 DLL 列表之间的差异有助于发现 msvcr120.dll 可能是原因。解决问题的重要线索。感谢您的帮助。 【参考方案1】:

当我们将 DLL 从一个系统移动到另一个系统时,DLL 将被阻止。所以你遇到了这个问题。

如何解锁 DLL:

    右键单击 DLL

    属性>>常规

    在底部你会看到解锁点击它。

详细解释见link

【讨论】:

感谢您的关注。您描述的安全部分没有出现在我们的系统上。可能因为 DLL 不只是从一个系统移动到另一个系统,而是随软件安装一起部署,所以不会被阻止。【参考方案2】:

Hans Passant 11 月 9 日 10:47

这是 DirectShow 的包装器,用 C++/CLI 编写。它有一个 对vcruntime140.dll的依赖,容易忽略。

在帮助我们指控 msvcr120.dll 的 Wai Ha Lee 评论旁边,我们发现此 DLL 是 Microsoft Visual C++ 2013 Redistributable 包的一部分。 安装到系统后,我们的软件视频使用正常!

提醒从微软下载它的链接: https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads

添加到我们软件的先决条件...

非常感谢您的关心和帮助!

【讨论】:

【参考方案3】:

我无法弄清楚这个错误,它在 Windows 7 上运行良好,但在 Windows 10 上却无法运行。我解决了这个问题,尽管它与缺少依赖项或运行时可再发行包无关。

问题是我不得不用 upx 打包 DLL,它又开始工作了。

在旧的 Windows XP 操作系统上解压缩和编译文件的某些东西创建了错误的 PE Header 或错误的文件格式或其他东西,但是使用 UPX 打包它现在可以正常工作,并且 DLL 缩小了 3 倍哈哈。

【讨论】:

以上是关于无法仅在特定系统上加载 DLL的主要内容,如果未能解决你的问题,请参考以下文章

仅在需要时加载 DLL [重复]

使用 C++ 和嵌入式单声道调用 C# DLL 时无法加载程序集系统

cryengine3无法定位程序输入点releasesrwlockexclusive于动态数据库KERNEL32.DLL上。

windows 无法启动加载内核所需的DLL文件

Http/2 站点仅在 Safari 9 上无法加载 - 在 Chrome、IE、Edge、Firefox 上加载正常

[转]System.DllNotFoundException: 无法加载 DLL“*.dll”: 内存位置访问无效。 (异常来自 HRESULT:0x800703E6)