当然,你也可以选择静态链接到新的C运行库,这样可以省去很多麻烦,当然也会增大最终程序的体积,同样也不怎么灵活,想想gdiplus.dll出现过的问题,你不能保证它们不会在这些新的C运行库里出现。另外的一种方案是坚持动态链接到这些新的 C运行库,同时给用户提供一个新的C运行库的版本,这个微软已经为你做好了,他们叫做Microsoft Visual C++ Redistributable Package,根据Visual Studio的版本提供相应的安装包即可,至于为啥不直接放一个新的C运行库到程序的目录里,那得要问微软的SxS机制。
不过抛开Window XP,在Window Vista里已经默认有msvcrt70.dll, msvcrt7.dll, msvcrt80.dll这几个版本,而Windows7里也增加了msvcrt90.dll,不过显然,你不能保证你的程序不会在一个没有这些新的C运 行库的操作系统上运行,动态链接到msvcrt.dll的好处很明显,自从Windows 98开始,它就作为系统的DLL常驻了,而且微软并没有抛弃它的打算,如果你分析一下Window的系统程序,从Windows XP到Windows 7,那些svchost.exe, services.exe, winlogon.exe, explorer.exe等等,都是动态链接到这个古老的C运行库,谁知道为啥他们不用新的。有意思的是Visual Studio的IDE用的正是它自己提供的相应的新CRT库。
Visual Studio并没有提供一个可以链接到旧的C运行库的选项,不过利用WinDDK提供的CRT的头文件和库文件,可以达到同样的目的。
WinDDK是MS提供驱动级程序开发的SDK,可以免费下载于 [How to Get the WDK], 这是一个几百M的SDK,不过只需要安装Develop Enveronment即可,并且我们也只需要其中的部分文件,列表如下:
WinDDK
├─inc
│ └─crt 下的所有文件
└─lib
├─crt 下的所有文件
....
──win7
│ ├─amd64
│ │ msvcrt_win2003.obj
│ ├─i386
│ │ msvcrt_win2000.obj
│ │ msvcrt_win2003.obj
│ │ msvcrt_winxp.obj
│ └─ia64
│ msvcrt_win2003.obj
├─wlh
│ ├─amd64
│ │ msvcrt_win2003.obj
│ ├─i386
│ │ msvcrt_win2000.obj
│ │ msvcrt_win2003.obj
│ │ msvcrt_winxp.obj
│ └─ia64
│ msvcrt_win2003.obj
├─wnet
│ ├─amd64
│ │ msvcrt_win2003.obj
│ ├─i386
│ │ msvcrt_win2003.obj
│ └─ia64
│ msvcrt_win2003.obj
└─wxp
└─i386
msvcrt_winxp.obj
2. 设置Linker的General选项Additinal Library Directories中增加 lib\Crt的路径.
3. 设置Linker的General选项Additinal Library Directories中增加lib\wxp\i386 的路径.
4. 设置Linker的Input选项Additional Dependencies中添加msvcrt_winxp.obj
本文介绍了VC6运行时库的优点,特别是其广泛的系统兼容性和无需处理manifest问题的特点。通过详细步骤展示了如何让新版本的Visual Studio使用古老的msvcrt.dll,从而避免因缺少运行库而导致的应用程序错误。


6万+

被折叠的 条评论
为什么被折叠?



