


下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Windows 下的動(dòng)態(tài)鏈接庫(kù)可能存在多個(gè)版本,比如系統(tǒng)提供的基本控件所在的 Comctl32.dll 就包括版本 6.0 和之前的版本。 在新版本之前編寫(xiě)的程序能否保證絕對(duì)和新版本的動(dòng)態(tài)鏈接 庫(kù)兼容呢?只能說(shuō),一般情況下可以,但是不能絕對(duì)保證。 Windows 提供了解決辦法,那 就是設(shè)定程序執(zhí)行的 Active Context 。對(duì)于客戶自己編寫(xiě)的動(dòng)態(tài)鏈接庫(kù),同樣也存在這樣的 問(wèn)題。 這里說(shuō)的是動(dòng)態(tài)鏈接庫(kù), 如果考慮動(dòng)態(tài)鏈接庫(kù)的其他應(yīng)用, 就涉及到更廣闊的應(yīng)用范 圍 了,可能是普通的動(dòng)態(tài)鏈接庫(kù), 可能是 COM 服務(wù)器等, 這些都是可以通過(guò)配置程序執(zhí)行 環(huán)境來(lái)改變具體使用哪個(gè)動(dòng)態(tài)鏈接庫(kù)。配
2、置程序執(zhí)行上下文, 實(shí)際就是配置程序執(zhí)行的組件配置, 這里的組件只要是指動(dòng) 態(tài)鏈接庫(kù)。對(duì)組件進(jìn)行配置,簡(jiǎn)單來(lái)說(shuō),就是配置程序使用什么動(dòng)態(tài)鏈接庫(kù)。這種 配置具 體是怎么實(shí)現(xiàn)的呢?其實(shí)就是在 Windows 程序真正啟動(dòng)之前增加了一層處理。這層處理就 是把程序執(zhí)行所需要的環(huán)境先建立好,直接點(diǎn)說(shuō)就是把需要的 動(dòng)態(tài)鏈接庫(kù)準(zhǔn)備好。上面說(shuō)到, 配置組件就是在程序真正執(zhí)行之前準(zhǔn)備好需要的動(dòng)態(tài)鏈接庫(kù), 這項(xiàng)工作 可以由 Windows 系統(tǒng)的 Module Loader 或者應(yīng)用程序自己完成。具體的實(shí)現(xiàn)方式有三種:1.文件級(jí)的配置:在應(yīng)用程序所在的目錄下創(chuàng)建一個(gè).exe.manifest 文件,這個(gè)文件中說(shuō)明
3、組件配置的具體信息,具體的信息格式可以查詢MSDN。在VS2003及以上的版本,新建工程時(shí),會(huì)自動(dòng)生成一個(gè) manifest 文件在 res 目錄下。2. 資 源 級(jí) 的 配 置 : 創(chuàng) 建 資 源 , 類 型 : RT_MANIFEST( 值 為 24 ), ID : CREATEPROCESS_MANIFEST_RESOURCE值D 為 1),內(nèi)容為上面的 manifest 文件的內(nèi)容。 Module Loader在加載EXE之后,執(zhí)行程序之前,會(huì)檢測(cè)到程序的資源表中是否有類型為24,ID 為 1 的資源,如果有這項(xiàng)配置信息,就會(huì)按照配置信息中的配置,加載對(duì)應(yīng)的動(dòng)態(tài)鏈接庫(kù)了。3資源和代碼混
4、合的配置:首先也需要添加資源,資源類型RT_MANIFEST值為24), ID為 ISOLATIONAWARE_MANIFEST_RESOURCE_ 2),內(nèi)容也為上述符合格式的 manifest 文件;然后再在#include之前增加一句#define ISOLATION_AWARE_ENABLED1這樣編譯器在編譯時(shí),會(huì)把一些API重定向到另外一 個(gè)API,這個(gè)API先進(jìn)行當(dāng)成程序 Active Con text的檢測(cè),如果程序執(zhí)行 Con text沒(méi)有配置成 資源文件所描述,會(huì)調(diào)用相應(yīng)的API配置好Context,然后再?gòu)哪康?API所在的動(dòng)態(tài)鏈 接庫(kù)中獲得函數(shù)地址(GetProcAdd
5、ress)后,通過(guò)函數(shù)指針調(diào)用目標(biāo)API,最后執(zhí)行完畢后恢復(fù)執(zhí)行環(huán)境。這可以保證在系統(tǒng) Module Loader 沒(méi)有程序 Active Context 支持時(shí),配置好程序 執(zhí)行環(huán)境。但是采用這種方法時(shí)需要注意,這是一種代碼級(jí)的支持,所以對(duì)MFC/ATL并不支持,因?yàn)?MFC/ATL庫(kù)編譯時(shí),并不是在 ISOLATION_AWARE_ENABLE已經(jīng)定義的情況下 編譯的。4.代碼級(jí)的配置:除了以上幾種方法之外,你還可以通過(guò)調(diào)用相應(yīng)的API,自己通過(guò)代碼來(lái)控制當(dāng)前的執(zhí)行環(huán)境,還可以做到一段代碼調(diào)用這個(gè)版本動(dòng)態(tài)鏈接庫(kù)中的代碼,另外一段代碼調(diào)用另外一個(gè)版本的動(dòng)態(tài)鏈接庫(kù)代碼。程序執(zhí)行Context
6、是線程有效的。這可能在什么情況下有應(yīng)用呢?比如說(shuō),你要開(kāi)發(fā)某個(gè)應(yīng)用程序的插件,你的插件依賴與系統(tǒng)提供的某個(gè)版本的動(dòng)態(tài)鏈接庫(kù), 但是應(yīng)用程序在不斷的升級(jí), 不能保證應(yīng)用程序的執(zhí)行環(huán)境 始終與最初發(fā)布版本一致。 這時(shí)你就可 以自己通過(guò)代碼來(lái)限定執(zhí)行環(huán)境了。 需要注意的是, 如果程序已經(jīng)采用了第三種方式進(jìn)行執(zhí)行環(huán)境的管理了, 你就不能使用代碼級(jí)的環(huán)境管理了。 前面說(shuō)的都是程序執(zhí)行Con text,實(shí)際準(zhǔn)確的說(shuō)應(yīng)該是模塊執(zhí)行Con text。對(duì)于動(dòng)態(tài)鏈接庫(kù),同樣可以進(jìn)行類似的配置。這些配置都有相應(yīng)的 API 及 manifest 文件格式,詳見(jiàn) MSDN。面說(shuō)了這么多,下面我們來(lái)做幾個(gè)簡(jiǎn)單的試驗(yàn)吧。1
7、. 使用VS2003,新建一個(gè)MFC對(duì)話框程序,隨便拖幾個(gè)控件進(jìn)去, 編譯。到Debug目錄下運(yùn)行,你會(huì)發(fā)現(xiàn)界面并不是 XP風(fēng)格的。在Res目錄下,你會(huì)發(fā)現(xiàn)一個(gè) manifest文件, 這個(gè)manifest文件是VC自動(dòng)生成的,里面包含使用XP風(fēng)格控件動(dòng)態(tài)鏈接庫(kù)的信息。把這個(gè)動(dòng)態(tài)鏈接庫(kù)拷貝到Debug目錄下,并重命名為.exe.manifest,再運(yùn)行程序,程序界面是否是XP風(fēng)格了?這是第一種方式的實(shí)現(xiàn)。2. 新建一個(gè) Win32 工程,在 about 對(duì)話框中隨便添加幾個(gè)控件,編譯運(yùn)行,對(duì)話框中的控件不是 XP風(fēng)格的。添加ID為1的RT_MANIFEST類 型資源,內(nèi)容為例1中的manife
8、st 文件內(nèi)容,再編譯運(yùn)行,可以看見(jiàn)對(duì)話框中控件為XP風(fēng)格。這是第二種方式的實(shí)現(xiàn)。3. 把上述工程中的 RT_MANIFEST資源ID修改為2,然后在stdafx.h中#“elude之前 增加#define IS0LATI0N_AWARE_ENABLED,1編譯運(yùn)行,對(duì)話框控件也是 XP風(fēng)格的。這是第 三種方式的實(shí)現(xiàn)。4. 在上述最原始 Win32 工程中,把 WinMain 函數(shù)修改如下:ACTCTX aetetx;HANDLE hAetCtx = INVALID_HANDLE_VALUE;statie eonst TCHAR szManifest = TEXT(Win32.manifest
9、);UL0NG_PTR ulpAetivationCookie;DW0RD dwLastError;/ Set up the aetivation eontext strueture memset(&aetetx, 0, sizeof(aetetx); aetetx.ebSize = sizeof(aetetx); aetetx.lpSouree = szManifest;/ Create the aetivation eontext, then delete the string - we dont need it / anymore.hAetCtx = CreateAetCtx(&aete
10、tx);dwLastError = GetLastError();/ Did we fail ereating the aetivation eontext?if (hAetCtx = INVALID_HANDLE_VALUE).SetLastError(dwLastError); / operator delete may have eleared it return 0;/ Aetivate the eontext and make use of itif (AetivateAetCtx(hAetCtx, &ulpAetivationCookie).之前 WinMian 函數(shù)的代碼/ Use SearchPath to find DLLs mentioned in the applications manifest,/ use COM to find isolated components, or use CreateWindow to find isolated/ window classes.if (!DeactivateActCtx(0, ulpActivationCookie)return 0;ReleaseActCt
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2.2社會(huì)主義制度在中國(guó)的確立 課件 統(tǒng)編版高中思想政治必修1中國(guó)特色社會(huì)主義
- 納稅評(píng)估工作總結(jié)十篇
- 老年日??祻?fù)護(hù)理課件
- 老年護(hù)理課件題目
- 老年人慢性病課件
- 老年中醫(yī)課件制作
- 通信設(shè)備車間使用權(quán)及技術(shù)轉(zhuǎn)讓合同模板
- 保險(xiǎn)理賠責(zé)任限制條件合同
- 大學(xué)國(guó)家安全教育考試試題及答案
- 輔警培訓(xùn)課件
- 信息系統(tǒng)的使用與維護(hù)管理制度
- 全國(guó)中小學(xué)生學(xué)籍信息管理系統(tǒng)用戶操作手冊(cè)(學(xué)校級(jí))
- 2025年北京市第一次普通高中學(xué)業(yè)水平合格性考試仿真模擬物理試卷01(解析版)
- 稽留流產(chǎn)治療
- 農(nóng)村基礎(chǔ)設(shè)施建設(shè)小微權(quán)力清單流程
- 雪亮工程可行性研究報(bào)告
- 小學(xué)班會(huì)-小學(xué)生主題班會(huì)版期末頒獎(jiǎng)班會(huì)-蔬菜篇(課件)(共23張課件)
- 肝包蟲(chóng)手術(shù)麻醉
- 《銀行禮儀培訓(xùn)方案》課件
- 床上用品采購(gòu)?fù)稑?biāo)方案(技術(shù)方案)
- 電力系統(tǒng)繼電保護(hù)課后習(xí)題解析(第二版)-張保會(huì)-尹項(xiàng)根主編
評(píng)論
0/150
提交評(píng)論