Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

C/C++本地代码调试

帖子发起人: Thomson   发起时间: 2009-09-09 15:06 下午   回复: 4

Print Search
帖子排序:    
   2009-09-09, 15:06 下午
Thomson 离线,最后访问时间: 2013/3/31 11:42:42 Thomson

发帖数前10位
注册: 2008-07-03
发 贴: 211
系统目录下面的msvcrt.dll是哪个版本的?
Reply Quote
自己写的c/c++程序,怎么link到这个dll,又怎么link到特定版本的dll呢?比如msvcrt90.dll.



IP 地址: 已记录   报告
   2009-09-10, 15:50 下午
dos 离线,最后访问时间: 2010/1/21 13:17:32 dos

发帖数前75位
注册: 2008-08-05
发 贴: 17
Re: 系统目录下面的msvcrt.dll是哪个版本的?
Reply Quote
可以使用depends来查看某个dll的版本;
dll是动态链接库,程序运行的时候才会加载的。
dll加载方式有两种,一种是显式加载,就是在程序里调用LoadLibrary来加载。此种方式可以以全路径指定加载的dll名称,所以完全可控,基本上是想加载哪个dll就加载哪个,呵呵~
还有一种加载方式是隐式加载,楼主问的估计是此类方式。
以隐式方式加载dll的程序,在运行时加载哪个dll,取决于程序编译时link了哪个lib。如果link了msvcrt90.dll对应的的lib,那么程序运行时就会试图加载msvcrt90.dll。
所以说,如果想加载某个版本的msvcrt dll,关键是程序link时要link到该版本对应的lib。
VS2008项目的link属性里,有一个“Ignore All default libraries“,默认是NO的,也就是说,会连接默认的库,msvcrt就是默认库之一。
将该选项改成Yes,然后在"Additional Dependencies"里填上"msvcrt.lib",
然后把你自己希望链接的msvcrt.lib放到你的工程的源代码目录下(如果不把你的lib放在那里,根据link的搜索路径规则,可能链接的不是你的lib,而是到默认的msvcrt.lib的)
然后重新build你的程序,这时候,你的程序运行时,就会试图加载你的那个msvcrt.lib对应的msvcrt的dll了。
用depends工具可以看到你的程序试图加载的dll版本。
注意,不管是msvcrt90.dll还是msvcrt80.dll,对应的lib名字都是msvcrt.lib。
那如何知道手头的这个msvcrt.lib对应的是哪个版本的dll的呢?这个...用dumpbin工具就可以,用/archivemembers参数。
下面的是我这边的输出结果。从结果看,链接我的这个msvcrt.lib的程序,运行时应该会加载msvcrt90.dll。

Archive member name at 2D0D4: MSVCR90.dll/
4A594B8C time/date Sun Jul 12 10:33:48 2009
uid
gid
0 mode
2C size
correct header end


IP 地址: 已记录   报告
   2009-09-10, 18:53 下午
Thomson 离线,最后访问时间: 2013/3/31 11:42:42 Thomson

发帖数前10位
注册: 2008-07-03
发 贴: 211
Re: 系统目录下面的msvcrt.dll是哪个版本的?
Reply Quote
谢谢.

我发现,系统目录下面的msvcrt.dll是 Microsoft 用的, MS的product,如果是动态链接应该会link到这个dll,而不是VS下的.

只是不知道动态链接到这个dll的lib在哪里可以得到..
IP 地址: 已记录   报告
   2009-09-11, 10:50 上午
dos 离线,最后访问时间: 2010/1/21 13:17:32 dos

发帖数前75位
注册: 2008-08-05
发 贴: 17
Re: 系统目录下面的msvcrt.dll是哪个版本的?
Reply Quote
嗯,这个“自用”的dll对应的lib...呵呵~可能不好找。试想,假设你自己发布了一款产品,如果产品包中也有些自己开发的dll,你也不会把这些自己开发的dll所对应的lib也release出来吧,呵呵~
不过有一个办法,如果你一定要用一个没有lib的dll,可以用显式加载的方式,包括用这个windows自带的dll。不过这样有些折腾。好像没有什么必要哈,毕竟VS各个版本,包括.net的运行环境安装包都是免费下载,可以合法跟随自己的产品重新发布的。
不知道楼主仅仅是作技术研究,还是遇到什么具体的问题,希望能通过链接到这个windows自带dll的方式来解决?

IP 地址: 已记录   报告
   2009-09-16, 17:11 下午
zeta 离线,最后访问时间: 2009/9/16 17:07:43 zeta

发帖数前500位
注册: 2008-06-03
发 贴: 1
Re: 系统目录下面的msvcrt.dll是哪个版本的?
Reply Quote
WDK的安装目录下面有这个文件的头文件和导入库,比如
C:\WinDDK\7600.16385.0\inc\crt
C:\WinDDK\7600.16385.0\lib\Crt\i386\msvcrt.lib
使用这个版本就可以链接到系统自带的msvcrt.dll
IP 地址: 已记录   报告
高端调试 » 软件调试 » C/C++本地代码调试 » Re: 系统目录下面的msvcrt.dll是哪个版本的?

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.