VC6编程,让程序有系统皮肤

上传人:无*** 文档编号:131524577 上传时间:2022-08-06 格式:DOCX 页数:2 大小:13.92KB
收藏 版权申诉 举报 下载
VC6编程,让程序有系统皮肤_第1页
第1页 / 共2页
VC6编程,让程序有系统皮肤_第2页
第2页 / 共2页
资源描述:

《VC6编程,让程序有系统皮肤》由会员分享,可在线阅读,更多相关《VC6编程,让程序有系统皮肤(2页珍藏版)》请在装配图网上搜索。

1、Windows卜的动态链接库可能存在多个版本,比如系统提供的基本控件所在的Comctl32.dll就包括版本6.0和之前的版本。在新版本Z前编写的程序能否保证绝对和新版本的动态链接库兼容呢?只能说,一般情况下可以,但是不能绝对保证。Windows提供了解决办法,那就是设定程序执行的ActiveContext。对于客户自己编写的动态链接库,同样也存在这样的问题。这里说的是动态链接库,如果考虑动态链接库的其他应用,就涉及到更广阔的应用范围了,可能是普通的动态链接库,可能是COM服务器等,这些都是可以通过配置程序执行环境来改变具体使用哪个动态链接库。配置程序执行上下文,实际就是配置程序执行的组件配置

2、,这里的组件只要是指动态链接库。对组件进行配置,简单来说,就是配置程序使用什么动态链接库。这种配置具体是怎么实现的呢?其实就是在Windows程序真正启动Z前增加了一层处理。这层处理就是把程序执行所需要的环境先建立好,直接点说就是把需要的动态链接库准备好。上面说到,配置组件就是在程序真正执行之前准备好需要的动态链接库,这项工作可以由Windows系统的ModuleLoader或者应用程序自己完成。具体的实现方式有三种:1文件级的配置:在应用程序所在的目录下创建一个.exe.man辻est文件,这个文件中说明组件配置的具体信息,具体的信息格式可以查询MSDNo在VS2003及以上的版本,新建工程

3、时,会自动生成一个manifest文件在res目录下。2.资源级的配置:创建资源,类型:RT_MAXIFEST(值为24),ID:CREATEPROCESS_MAXIFEST_RESOURCE值D为1),内容为上面的manifest文件的内容。ModuleLoader在加载EXE之后,执行程序之前,会检测到程序的资源表中是否有类型为24,ID为1的资源,如果有这项配置信息,就会按照配置信息屮的配置,加载对应的动态链接库了。3资源和代码混合的配置:首先也需要添加资源,资源类型RTJIANIFEST值为24),ID为ISOLATIOXAWARE_MANIFEST_RESOURCE_2),内容也为上

4、述符合格式的manifest文件;然后再在include之前增加一句ffdefineISOLATIOX_AWARE_ENABLED1这样编译器在编译时,会把一些API重定向到另夕|、一个API,这个API先进行当成程序ActiveContext的检测,如果程序执行Context没有配置成资源文件所描述,会调用相应的API配置好Context,然后再从目的API所在的动态链接库中获得函数地址(GetProcAddress)后,通过函数指针调用目标API,最后执行完毕后恢复执行环境。这可以保证在系统ModuleLoader没有程序ActiveContext支持时,配曽好程序执行环境。但是采用这种方

5、法时需要注意,这是一种代码级的支持,所以对MFC/ATL并不支持,因为MFC/ATL库编译时,并不是在ISOLATION_AWARE_ENABLE已经定义的情况下编译的。4.代码级的配置:除了以上几种方法之外,你还可以通过调用相应的API,自己通过代码来控制当前的执行环境,还可以做到一段代码调用这个版本动态链接库屮的代码,另外一段代码调用另外一个版本的动态链接库代码。程序执行Context是线程有效的。这可能在什么情况下有应用呢?比如说,你要开发某个应用程序的插件,你的插件依赖与系统提供的某个版本的动态链接库,但是应用程序在不断的升级,不能保证应用程序的执行环境始终与最初发布版本一致。这时你就

6、可以自己通过代码来限定执行环境了。需要注意的是,如果程序已经采用了第三种方式进行执行环境的管理了,你就不能使用代码级的环境管理了。前面说的都是程序执行Context,实际准确的说应该是模块执行Contexto对于动态链接库,同样可以进行类似的配置。这些配置都有相应的API及manifest文件格式,详见MSDNo面说了这么多,下面我们来做几个简单的试验吧。1.使用VS2003,新建一个MFC对话框程序,随便拖几个控件进去,编译。到Debug目录下运行,你会发现界面并不是XP风格的。在Res目录下,你会发现一个manifest文件,这个manifest文件是VC自动生成的,里面包含使用XP风格控

7、件动态链接库的信息。把这个动态链接库拷贝到DebugB录下,并重命名为.exe.manifest,再运行程序,程序界面是否是XP风格了?这是第一种方式的实现。新建一个Win32工程,在about对话框中随便添加几个控件,编译运行,对话框中的控件不是XP风格的。添加ID为1的RT_MANIFEST类型资源,内容为例1屮的maMfest文件内容,再编译运行,可以看见对话框中控件为XP风格。这是第二种方式的实现。2. 把上述工程屮的RT_MANIFEST资源ID修改为2,然后在stdafx.h中#elude之前增加ffdefineISOLATION_AWARE_ENABLED,1编译运行,对话框控件

8、也是XP风格的。这是第三种方式的实现。3. 在上述最原始Win32工程中,把WinMain函数修改如下:ACTCTXaetetx;HANDLEhAetCtx=INVALID_HANDLE_VALUE;staticeonstTCHARszManifest=TEXT(z,Win32.manifest);UL0NG_PTRulpAetivationCookie;DWORDdwLastError;/Setuptheaetivationeontextstructurememset(&aetetx,0,sizeof(aetetx);aetetx.ebSize二sizeof(aetetx);setetx1p

9、Souree=szManifest;/Createtheaetivationeontext,thendeletethestring-wedorftneedit/anymorehAetCtx=CreateAetCtx(&aetetx);dwLastError二GetLastError();/Didwefailereatingtheaetivationeontext?辻(hAetCtx二=INVALID_HANDLE_VALUE).SetLastError(dwLastError);/operatordeleteJmayhaveeleareditreturn0;/Aetivatetheeontex

10、tandmakeuseofitif(AetivateAetCtx(hAetCtx,&uIpAetivationCookie)Z前WinMian函数的代码/UseSearchPathtofindDLLsmentionedintheapplicationsmanifest,/useCOMtofindisolatedcomponents,oruseCreateWindowtofindisolated/windowclassesif(!DeactivateAetCtx(0,ulpAetivationCookie)return0;同时保证EXE所在目录下有/n32.manifest文件,内容ReleaseActCtx(hActCtx);保证增加以上代码后可以编译通过,为之前的XP主题配置信息。运行程序,会看见控件为XP主题,注释掉ActivateActCtx,控件不再是XP主题。以上的例子主要是如何实现XP主题,但是程序执行环境的配置不仅仅实现XP主题,还有很多更广阔的应用。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!