Chinaunix首页 | 论坛 | 博客
  • 博客访问: 218482
  • 博文数量: 67
  • 博客积分: 3156
  • 博客等级: 中校
  • 技术积分: 650
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-18 17:41
个人简介

软件工程师!

文章分类

全部博文(67)

文章存档

2015年(1)

2014年(1)

2012年(6)

2011年(16)

2010年(31)

2009年(12)

分类: C/C++

2010-07-12 08:32:41

认识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控件.

 
文件: Demo.rar
大小: 19KB
下载: 下载
阅读(1511) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~