
微软
首先,存在静态链接这种情况,能够直接将运行库链接到exe文件之中。其次,商业开发软件在编写安装程序时,也会提供运行库以便包含进去。在相当长的一段时间里,
微软是允许第三方开发者链接到Windows自带的msvcrt.dll的。这个msvcrt.dll从Windows 95开始就被系统自带了,当时还没有Windows更新推送机制,由于文件版本十分混乱(后面会提及),所以用户的操作系统上具体是哪个版本是无法知晓的。Visual
C++的程序员们为了保证自己所需要的Visual
C++库版本存在于客户的系统之上,就会在安装过程中将自己开发时使用的msvcrt.dll复制到系统目录下。这就引发了一个很大的问题,也就是所谓的DLL hell。用户并不会总是按照产品发布的时间顺序来安装程序。老程序的安装可能会将新程序以及操作系统正在使用的msvcrt.dll覆盖掉。经过对程序员们的教育之后,现在安装程序的编写者理论上在覆盖之前应该检查文件版本,如果版本较旧就不进行覆盖。然而,即便较旧的不覆盖,这个DLL的不同版本也并非完全二进制兼容。其中一个最严重的问题就是安装Visual
C++ 6.0版本的msvcrt.dll会导致部分Visual
C++ 5.0程序出错,对同一个地址调用free函数两次如今会使程序崩溃(KB194550 PRB: Freeing Memory Multiple Times May Cause an Access Violation)。说实在的,这并不是
微软的过错,析构函数被调用两次,谁也不知道会出现什么问题,这个问题直到Visual Studio 6.0 Sp3才得以解决。另外,堆块大小的减小也使得存在访问越界情况的程序更容易崩溃(FIX: You receive an invalid page fault in module MSVCRT.DLL error message after you install the run - time libraries from Visual
C++ 6.0)。为了避免用户无法使用一些老程序,msvcrt.dll现在会检测被调用的程序,如果是旧程序就运行Visual
C++ 5版本的堆,如果是新版本就运行Visual
C++ 6.0的堆。