下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、Windows 下的動態(tài)鏈接庫可能存在多個版本,比如系統(tǒng)提供的基本控件所在的 Comctl32.dll 就包括版本 6.0 和之前的版本。 在新版本之前編寫的程序能否保證絕對和新版本的動態(tài)鏈接 庫兼容呢?只能說,一般情況下可以,但是不能絕對保證。 Windows 提供了解決辦法,那 就是設定程序執(zhí)行的 Active Context 。對于客戶自己編寫的動態(tài)鏈接庫,同樣也存在這樣的 問題。 這里說的是動態(tài)鏈接庫, 如果考慮動態(tài)鏈接庫的其他應用, 就涉及到更廣闊的應用范 圍 了,可能是普通的動態(tài)鏈接庫, 可能是 COM 服務器等, 這些都是可以通過配置程序執(zhí)行 環(huán)境來改變具體使用哪個動態(tài)鏈接庫。配
2、置程序執(zhí)行上下文, 實際就是配置程序執(zhí)行的組件配置, 這里的組件只要是指動 態(tài)鏈接庫。對組件進行配置,簡單來說,就是配置程序使用什么動態(tài)鏈接庫。這種 配置具 體是怎么實現(xiàn)的呢?其實就是在 Windows 程序真正啟動之前增加了一層處理。這層處理就 是把程序執(zhí)行所需要的環(huán)境先建立好,直接點說就是把需要的 動態(tài)鏈接庫準備好。上面說到, 配置組件就是在程序真正執(zhí)行之前準備好需要的動態(tài)鏈接庫, 這項工作 可以由 Windows 系統(tǒng)的 Module Loader 或者應用程序自己完成。具體的實現(xiàn)方式有三種:1.文件級的配置:在應用程序所在的目錄下創(chuàng)建一個.exe.manifest 文件,這個文件中說明
3、組件配置的具體信息,具體的信息格式可以查詢MSDN。在VS2003及以上的版本,新建工程時,會自動生成一個 manifest 文件在 res 目錄下。2. 資 源 級 的 配 置 : 創(chuàng) 建 資 源 , 類 型 : RT_MANIFEST( 值 為 24 ), ID : CREATEPROCESS_MANIFEST_RESOURCE值D 為 1),內(nèi)容為上面的 manifest 文件的內(nèi)容。 Module Loader在加載EXE之后,執(zhí)行程序之前,會檢測到程序的資源表中是否有類型為24,ID 為 1 的資源,如果有這項配置信息,就會按照配置信息中的配置,加載對應的動態(tài)鏈接庫了。3資源和代碼混
4、合的配置:首先也需要添加資源,資源類型RT_MANIFEST值為24), ID為 ISOLATIONAWARE_MANIFEST_RESOURCE_ 2),內(nèi)容也為上述符合格式的 manifest 文件;然后再在#include之前增加一句#define ISOLATION_AWARE_ENABLED1這樣編譯器在編譯時,會把一些API重定向到另外一 個API,這個API先進行當成程序 Active Con text的檢測,如果程序執(zhí)行 Con text沒有配置成 資源文件所描述,會調(diào)用相應的API配置好Context,然后再從目的 API所在的動態(tài)鏈 接庫中獲得函數(shù)地址(GetProcAdd
5、ress)后,通過函數(shù)指針調(diào)用目標API,最后執(zhí)行完畢后恢復執(zhí)行環(huán)境。這可以保證在系統(tǒng) Module Loader 沒有程序 Active Context 支持時,配置好程序 執(zhí)行環(huán)境。但是采用這種方法時需要注意,這是一種代碼級的支持,所以對MFC/ATL并不支持,因為 MFC/ATL庫編譯時,并不是在 ISOLATION_AWARE_ENABLE已經(jīng)定義的情況下 編譯的。4.代碼級的配置:除了以上幾種方法之外,你還可以通過調(diào)用相應的API,自己通過代碼來控制當前的執(zhí)行環(huán)境,還可以做到一段代碼調(diào)用這個版本動態(tài)鏈接庫中的代碼,另外一段代碼調(diào)用另外一個版本的動態(tài)鏈接庫代碼。程序執(zhí)行Context
6、是線程有效的。這可能在什么情況下有應用呢?比如說,你要開發(fā)某個應用程序的插件,你的插件依賴與系統(tǒng)提供的某個版本的動態(tài)鏈接庫, 但是應用程序在不斷的升級, 不能保證應用程序的執(zhí)行環(huán)境 始終與最初發(fā)布版本一致。 這時你就可 以自己通過代碼來限定執(zhí)行環(huán)境了。 需要注意的是, 如果程序已經(jīng)采用了第三種方式進行執(zhí)行環(huán)境的管理了, 你就不能使用代碼級的環(huán)境管理了。 前面說的都是程序執(zhí)行Con text,實際準確的說應該是模塊執(zhí)行Con text。對于動態(tài)鏈接庫,同樣可以進行類似的配置。這些配置都有相應的 API 及 manifest 文件格式,詳見 MSDN。面說了這么多,下面我們來做幾個簡單的試驗吧。1
7、. 使用VS2003,新建一個MFC對話框程序,隨便拖幾個控件進去, 編譯。到Debug目錄下運行,你會發(fā)現(xiàn)界面并不是 XP風格的。在Res目錄下,你會發(fā)現(xiàn)一個 manifest文件, 這個manifest文件是VC自動生成的,里面包含使用XP風格控件動態(tài)鏈接庫的信息。把這個動態(tài)鏈接庫拷貝到Debug目錄下,并重命名為.exe.manifest,再運行程序,程序界面是否是XP風格了?這是第一種方式的實現(xiàn)。2. 新建一個 Win32 工程,在 about 對話框中隨便添加幾個控件,編譯運行,對話框中的控件不是 XP風格的。添加ID為1的RT_MANIFEST類 型資源,內(nèi)容為例1中的manife
8、st 文件內(nèi)容,再編譯運行,可以看見對話框中控件為XP風格。這是第二種方式的實現(xiàn)。3. 把上述工程中的 RT_MANIFEST資源ID修改為2,然后在stdafx.h中#“elude之前 增加#define IS0LATI0N_AWARE_ENABLED,1編譯運行,對話框控件也是 XP風格的。這是第 三種方式的實現(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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國電視劇行業(yè)并購重組擴張戰(zhàn)略制定與實施研究報告
- 2025-2030年中國消費性服務行業(yè)并購重組擴張戰(zhàn)略制定與實施研究報告
- 2025-2030年中國動力電池行業(yè)并購重組擴張戰(zhàn)略制定與實施研究報告
- 自動坦克模型課程設計指導書7
- 自動安平水準儀設計
- 袋鼠爪養(yǎng)護知識培訓課件
- 2024年口語交際教案
- 期刊雜志市場深度調(diào)查及發(fā)展前景研究預測報告
- 2018-2024年中國多肉植物市場深度調(diào)研分析及投資前景研究預測報告
- 春季新銷售風暴
- 2025年湖南出版中南傳媒招聘筆試參考題庫含答案解析
- 2025年度商用廚房油煙機安裝與維護服務合同范本3篇
- 2024年03月恒豐銀行2024年春季招考畢業(yè)生筆試歷年參考題庫附帶答案詳解
- 網(wǎng)絡安全系統(tǒng)運維方案
- ISO 56001-2024《創(chuàng)新管理體系-要求》專業(yè)解讀與應用實踐指導材料之14:“6策劃-6.3變更的策劃”(雷澤佳編制-2025B0)
- 【公開課】同一直線上二力的合成+課件+2024-2025學年+人教版(2024)初中物理八年級下冊+
- 12G614-1砌體填充墻結構構造
- 電鍍產(chǎn)品檢驗作業(yè)指導書
- 湖北省武漢市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會明細及行政區(qū)劃代碼
- 路面輪胎模型建立方法swift
- 10KV供配電工程施工組織設計
評論
0/150
提交評論