首页
社区
课程
招聘
[分享]使 vc2008 编译的程序动态链接到 msvcrt.dll
发表于: 2009-1-31 00:04 15313

[分享]使 vc2008 编译的程序动态链接到 msvcrt.dll

2009-1-31 00:04
15313

vc2005 编译的程序将链接到msvcr80.dll,vc2008 编译的程序将链接到msvcr90.dll。程序在未安装vc2005或vc2008运行库的机器上将无法运行。
   微软给出的答案是只能连接到msvcrxx.dll,而且必须安装运行库,拷贝的不行。
   你可以使用vc6或是其他编译器,或者用汇编写程序。
     或者你可以用下边的方法:
   不管是下载还是拷贝得到WDK中的msvcrt_winxp.obj和msvcrt.lib,加入到项目/属性/连接器/输入/附加依赖项或直接加入到命令行,版本选Release(因为Debug版会从msvcr90.dll导入一个辅助函数),然后编译。使用工具查看文件的导入,只有msvcrt,没有了msvcr90。
   但是这样编译的文件在没有vc2005或2008运行库的系统上仍然不能运行!
     这是因为manifest文件的缘故,你可以有两种选择,一是不使用manifest文件,而是使用下面的清单资源RC文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
    name="XP Style Manifest"
    processorArchitecture="x86"
    version="5.1.0.0"
    type="win32"/>
<description>Windows Shell</description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="x86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>

这是一种较好的方法,可以保证最大的兼容性。VISTA中的MSvcrt.DLL已经实现了MSvcr80.dll中的大部分功能,包括很多带_s
的安全字符串处理函数,如果你在程序中使用了这些函数,则只能在vista中运行,否则会报错。
其他还有很多方法,比如用VC6中的Msvcrt.Lib替换vc2008中的msvcrt.lib,但需要手工加入CxxFrameHandler3和CheckCookie@4或者不使用这些特性。如果你想使用msvcr90.dll又不想安装它,可以通过删除manifest文件中的publicKeyToken字段使它可以放在程序目录中使用。如果你连manifest文件都不想要,可以自己编译一个运行库代替它,或者用二进制编辑软件修改
msvcr80.dll
00001D76 -> B8 01 00 00 00 C3
msvcr90.dll
000021be -> B8 01 00 00 00 C3

B8 01 00 00 00 C3 == mov eax,0001 retn
作用是取消了运行库的_check_manifest 函数


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (5)
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
msvcrt.dll 和 msvcr80.dll / msvcr90.dll 的有些函数的参数定义不一样,例如:swprintf等 。
2009-2-1 08:56
0
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
楼主静态搞下省事多了,如果真要动态用crt建议还是用新的,新的crt往往修正了什么漏洞bug之类的,更安全, 个人建议仅供参考
2009-2-1 11:20
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不错,受教了。正愁这个问题呢!
2009-3-3 00:05
0
雪    币: 367
活跃值: (20)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
5
链接到 msvcrt.dll 是不错的,安全性也不用担心,OS自带的dll如果有bug,系统安全更新会更新之,反倒是VC运行库的更新,最终用户不会注意,系统安全更新不一定会将其更新
2009-9-5 20:48
0
雪    币: 952
活跃值: (1821)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这种方法全局类变量无法初始化的
2009-9-6 04:30
0
游客
登录 | 注册 方可回帖
返回
//