Visual c++ 为什么ucrtbase导出CxxThrowException? 为什么ucrtbase.dll和vcruntime140.dll在它们根据依赖关系导出的一些函数中重叠?

Visual c++ 为什么ucrtbase导出CxxThrowException? 为什么ucrtbase.dll和vcruntime140.dll在它们根据依赖关系导出的一些函数中重叠?,visual-c++,dllexport,msvcrt,vcredist,universal-crt,Visual C++,Dllexport,Msvcrt,Vcredist,Universal Crt,免责声明:这是目前我纯粹的学术兴趣 我目前正在尝试了解Microsoft Visual C++CRT相关DLL文件的布局。在此处查找UCRT和文件的一般信息: 简而言之,对于一个普通的C++应用程序,运行时有这些(Topple)DLL依赖关系: ucrtbase.dll-“独立于编译器”的东西 vcruntime.dll-“依赖于编译器”的东西 代码> MVCP.DLL< /COD> -C++标准库 从该信息中可以突出显示的内容是: 从博客条目: 。。。将CRT拆分为两个逻辑部分:V

免责声明:这是目前我纯粹的学术兴趣

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

简而言之,对于一个普通的C++应用程序,运行时有这些(Topple)DLL依赖关系:

  • ucrtbase.dll
    -“独立于编译器”的东西
  • vcruntime.dll
    -“依赖于编译器”的东西
  • 代码> MVCP.DLL< /COD> -C++标准库
从该信息中可以突出显示的内容是:

从博客条目:

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

从MSDN页面:

VCRUNTIME库包含Visual C++ CRT实现专用 代码,例如异常处理和调试支持、运行时检查 以及类型信息、实施细节和某些扩展信息 图书馆职能。此库特定于的版本 使用的编译器

在使用浏览DLL时,我注意到ucrt和vcruntime都会导出该函数。如果您曾经查看过vc++堆栈跟踪,则此函数是您的老朋友:

生成异常记录并调用运行时环境以开始处理异常

我很惊讶地发现它是从
ucrtbase.dll
导出的,正如上面两个引号所指出的那样,我本以为这种机制完全属于编译器特定的方面

在写这篇文章时,我注意到了一些其他的重叠:一些标准的C库函数(
memcpy
,…,
strstr
,…)也从
vcruntime140.dll
导出,尽管我希望它们只存在于
ucrtbase

那么这里发生了什么,我能从中学到什么呢?

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


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

希望在密切投票警察推翻你的学术问题之前得到答案……这是“基础”在C++中抛出异常是很基础的,也是在WRRT应用程序中做的事情。WinRT与“编译器无关”的PATH无关。所以它只是一个实现工件。谢谢。