为什么使用系统的MSVC运行时DLL有时而不是我们的dll?

问题描述 投票:0回答:1
为了降低应用程序的安装程序的大小,不要迫使用户下载MSVC Runtime Repistributable安装程序,我们将所有我们需要的MSVC Runtime DLL(仅它们)包含在我们的安装程序中,使用以下技术

。 到目前为止,所有这些人的工作正常。最近,我们切换到使用了MSVC2022和14.42.34433.0版本的运行时版本(非常新的)。现在,我们正在从用户那里获得崩溃转储。没有太多(每1000个用户约1个),具有以下堆栈跟踪:

msvcp140.dll!00007ffa1d488c34() Unknown myapp.exe!std::_Mutex_base::lock() Line 52 C++ myapp.exe!std::unique_lock<std::mutex>::{ctor}(std::mutex &) Line 144 C++

我们已经分析了所有这些报告,并发现所有这些报告中的MSVC运行时DLL都从
C:\Windows\System32

文件夹加载,而不是从我们的应用程序夹中加载。这些运行时DLL比我们使用的DLL年龄太大(例如
14.28.29910.0

14.0.2415.1

)。看来它们与我们的应用程序构建不兼容二元。
Question
的可能原因是这些系统的DLL被加载而不是我们的应用程序提供的DLL?

no默认情况下,Windows将在应用程序启动时遵循特定的搜索订单DLL: 包含可执行文件的目录

windows visual-c++
1个回答
0
投票
Systems32目录

  1. ,但某些问题可能会导致它跳过应用程序目录并转到系统32目录。

  2. 如果您的应用程序的文件夹不包含所有必要的MSVC运行时DLL,则它将转到System32,因此您可能会缺少1个或更多的依赖项,但具有其他X DLL,它仍然会访问System32
  3. 版本不完全匹配

    如果您有一个嵌入式清单,它将尝试在版本(即在您的情况下14.42.34433.0
  1. 如果您没有清单,它将尝试进行一般匹配,通常主要版本是兼容的,因此任何一个更高或更低版本通常都可以正常工作,尽管不能保证。这些较少的版本通常在其中有特定的错误修复,这可能就是为什么您仅在一部分用户中看到问题
    1. 通常 - 清单中没有清单或不正确的版本表示默认行为,这意味着它将仅使用System32版本,该版本可能是版本14,而不是“正确”版本14.

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.