2

根据 Dependency Walker,为什么它们导出ucrtbase.dll的某些功能会重叠?vcruntime140.dll

免责声明:目前这对我来说纯粹是学术兴趣。

我目前正在尝试了解 Microsoft Visual-C++ CRT 相关 DLL 文件的布局。在此处查找 UCRT 的信息和一般文件:

简而言之,对于普通的 C++ 应用程序,您在运行时拥有这些(顶级)DLL 依赖项:

  • ucrtbase.dll- “编译器独立”的东西
  • vcruntime<ver>.dll- “编译器依赖”的东西
  • msvcp<ver>.dll- C++ 标准库

可以从该信息中突出显示的是:

从博客条目:

...将 CRT 分成两个逻辑部分: VCRuntime,其中包含进程启动和异常处理等所需的编译器支持功能...

并从 MSDN 页面:

vcruntime 库包含 Visual C++ CRT 实现特定的代码,例如异常处理和调试支持、运行时检查和类型信息、实现细节和某些扩展库函数。该库特定于所使用的编译器版本。

在使用Dependency Walker浏览 DLL 时,我注意到ucrt和 vcruntime 都导出了该函数_CxxThrowException。如果您曾经查看过 vc++ 堆栈跟踪,那么这个函数是老熟人了:

构建异常记录并调用运行环境开始处理异常。

我很惊讶地发现它是从ucrtbase.dllas 中导出的——正如上面的两个引号所表明的那样——我认为这种机器完全属于编译器特定的一面。

memcpy在写这篇文章时,我注意到了其他一些重叠:strstr虽然vcruntime140.dll我预计它们只存在于ucrtbase.

那么这里发生了什么,我可以从中学到什么?

4

1 回答 1

3

通用 CRT (ucrtbase.dll) 包含 VCRuntime 的私有副本,供 Windows 操作系统组件使用。VCRuntime 的这个私有副本是操作系统的内部实现细节,并且可能随时更改(即,没有任何应用程序兼容性保证。

在任何情况下都不要使用通用 CRT 中的这些导出。(Windows SDK 中没有库为这些导出提供可链接符号,因此不可能意外使用它们。)

于 2016-10-22T02:33:44.167 回答