认识mainifest

认识mainifest

作者:忙碌命

Blog: http://blog.csdn.net/laiboy

          http://laiboy.cnblog.cn

 

什么是mainifest

自从Windows XP后,在Windows的系统目录下会有这个目录 WinSxS,如下图:

 

 

这个是Microsoft为了解决"Dll Hell"采用的一种技术,官方的定义名称为"SxS",总的来说,它的真正名称为"Side-by-Side Assembly",而Side-by-Side Assembly的主要作用就是,就是将程序的依赖关系(动态库,COM组件等资源)利用xml文件描述,当程序被载入的时候,操作系统就将程序的mainifest所描述的的动态库载入,例如一个目录下具有两个不同的动态库的,功能一样,版本不一样。程序使用了manifest后,操作系统可以载入manifest指定的动态库版本。如下图所示的动态库载入过程:

 

 

好了,大概就这么样,知道manifest后,就需要让它解决实际的问题,以下我会写一个简单的程序问题,让manifest解决。不过在此之前,还需要了解一个东西,就是操作系统对manifest文件保留使用了的资源ID号。

 

RT_MANIFEST

 

Microsoft自从Windows XP开始,操作系统就为SxS的manifest保留了默认的资源ID号,这种资源的类型就是RT_MANIFEST,Windows的保留的资源的ID号的值的范围为(1-16),你的程序中绝对不可以定义这些ID值,即定义你的资源值为1-16之间的范围,WindowsXP以上的操作系统会拒绝载入你使用这些ID值定义的资源。可以从SDK的头文件中WinUser.h中找到这些定义的ID值。

 

 

 

同时,你可以看到对RT_MANIFEST的资源ID值定义为24,

CREATEPROCESS_MANIFEST_RESOURCE_ID的值定义为1,所以,在你的资源中你也不可以再定义24为你的除manifest这类资源以外的资源。通过这个资源ID号,系统会在程序起动时,自动先加载读取manifest的资源,资源ID值为1(CREATEPROCESS_MANIFEST_RESOURCE_ID)

 

应用

 

用过VC2005的人写C++程序的时候都会看到在编译程序输出的目录下都会多一个app.manifest的文件。发布的时候,都需要将这个manifest的文件跟发布程序一起发布,而且,同时,都需要安装vc_redistrubte包。

很麻烦吧!!!

解决方法可以看我的两篇文章“部署VC2008程序”,但是意外很多时候都有的,程序的manifest不见了,导致程序不能起动!

其次,在用VC2008,VC2005,VC6写的MFC的应用程序,窗口的控件都是没有XP操作系统上的窗口控件的主题。

 

 

 

主要原因是没有使用Microsoft.Windows.Common-Controls,即新版本的控件,6.0版,如果没有在manifest中指定,则会使用旧版本的通用控件。这些问题都可以使用内嵌的manifest的文件进程解决.如下图,在vc6的工程中嵌入以下manifest的文件,就可以让vc6的程序具有xp风格的控件.

 

 

 

使用两个特殊ID加入到rc文件中

 

 

 

重新编译,看看使用前和使用后的比较!

 

 

这样,省了很多到优化在XP下的控件的主题的功夫!省时间!

Manifest的作用还不止这些.利用manifest文件,也可以实现无注册使用COM控件.

 

源码下载 http://blogimg.chinaunix.net/blog/upfile2/100712083303.rar

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值