- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Windows 下的动态链接库可能存在多个版本,比如系统提供的基本控件所在的 Comctl32.dll 就包括版本 6.0 和之前的版本。 在新版本之前编写的程序能否保证绝对和新版本的动态链接 库兼容呢?只能说,一般情况下可以,但是不能绝对保证。 Windows 提供了解决办法,那 就是设定程序执行的 Active Context 。对于客户自己编写的动态链接库,同样也存在这样的 问题。 这里说的是动态链接库, 如果考虑动态链接库的其他应用, 就涉及到更广阔的应用范 围 了,可能是普通的动态链接库, 可能是 COM 服务器等, 这些都是可以通过配置程序执行 环境来改变具体使用哪个动态链接库。
配置程序执行上下文, 实际就是配置程序执行的组件配置, 这里的组件只要是指动 态链接库。对组件进行配置,简单来说,就是配置程序使用什么动态链接库。这种 配置具 体是怎么实现的呢?其实就是在 Windows 程序真正启动之前增加了一层处理。这层处理就 是把程序执行所需要的环境先建立好,直接点说就是把需要的 动态链接库准备好。
上面说到, 配置组件就是在程序真正执行之前准备好需要的动态链接库, 这项工作 可以由 Windows 系统的 Module Loader 或者应用程序自己完成。具体的实现方式有三种:
1.文件级的配置:在应用程序所在的目录下创建一个 .exe.manifest 文件,这个文件
中说明组件配置的具体信息,具体的信息格式可以查询 MSDN。在VS2003及以上的版本,
新建工程时,会自动生成一个 manifest 文件在 res 目录下。
2. 资 源 级 的 配 置 : 创 建 资 源 , 类 型 : RT_MANIFEST( 值 为 24 ), ID : CREATEPROCESS_MANIFEST_RESOURCE值D 为 1),内容为上面的 manifest 文件的内容。 Module Loader在加载EXE之后,执行程序之前,会检测到程序的资源表中是否有类型为 24,
ID 为 1 的资源,如果有这项配置信息,就会按照配置信息中的配 置,加载对应的动态链接
库了。
3?资源和代码混合的配置:首先也需要添加资源,资源类型RT_MANIFEST值为24), ID为 ISOLATIONAWARE_MANIFEST_RESOURCE_^ 2),内容也为上述符合格式的 manifest 文件;然后再在#include之前增加一句
#define ISOLATION_AWARE_ENABLED°1这样编译器在编译时,会把一些API重定向到另外一 个API,这个API先进行当成程序 Active Con text的检测,如果程序执行 Con text没有配置成 资源文件所描述,会调用相应的 API配置好Context,然后再从目的 API所在的动态链 接库
中获得函数地址(GetProcAddress)后,通过函数指针调用目标 API,最后执行完毕后恢复
执行环境。这可以保证在系统 Module Loader 没有程序 Active Context 支持时,配置好程序 执行环境。但是采用这种方法时需要注意,这是一种代码级的支持,所以对 MFC/ATL并不
支持,因为 MFC/ATL库编译时,并不是在 ISOLATION_AWARE_ENABLE已经定义的情况下 编译的。
4.代码级的配置:除了以上几种方法之外,你还可以通过调用相应的 API,自己通
过代码来控制当前的执行环境,还可以做到一段代码调用这个版本动态链接库 中的代码,
另外一段代码调用另外一个版本的动态链接库代码。程序执行 Context 是线程有效的。这可
能在什么情况下有应用呢?比如说,你要开发某个应用 程序的插件,你的插件依赖与系统
提供的某个版本的动态链接库, 但是应用程序在不断的升级, 不能保证应用程序的执行环境 始终与最初发布版本一致。 这时你就可 以自己通过代码来限定执行环境了。 需要注意的是, 如果程序已经采用了第三种方式进行执行环境的管理了, 你就不能使用代码级的环境管理了。 前面说的都是程序执行 Con text,实际准确的说应该是模块执行 Con text。对于动态链接库,
同样可以进行类似的配置。这些配置都有相应的 API 及 manifest 文件格式,详见 MSDN。
面说了这么多,下面我们来做几个简单的试验吧。
使用VS2003,新建一个MFC对话框程序,随便拖几个控件进去, 编译。到Debug
目录下运行,你会发现界面并不是 XP风格的。在Res目录下,你会发现一个 manifest文件, 这个manifest文件是VC自动生成的,里面包含使用 XP风格控件动态链接库的信息。把这
个动态链接库拷贝到 Debug目录下,并重命名为.e
原创力文档


文档评论(0)