亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > 易語言 > 正文

總結升級易語言支持庫保證向下兼容性

2024-07-21 23:02:54
字體:
來源:轉載
供稿:網友

易語言支持庫升級之后,要保證向下兼容性,主要是做到以下幾點:

一:保證原有的易語言源程序(.e)能正常打開(兼容點1)、正常編譯(兼容點2)、編譯結果正確(兼容點3);

二:保證原有的易語言程序(.exe)能正常運行(兼容點4)、運行結果正確(兼容點5)。

這里說的“原有的易語言源程序”和“原有的易語言程序”是指,替換新版支持庫文件之前,使用舊版支持庫編寫的易語言源程序,和使用該源程序編譯生成的可執行程序。

本文主要就此問題結合具體情況進行分析和總結。

一,為支持庫增加一條命令

新增加的命令,必須放在所有原有命令的后面,否則將違反兼容點2和4,更無法保證兼容點3和5。這是因為,在源程序和EXE中,記錄的都是命令的索引,一旦在中間插入一條命令,將導致后面的命令索引全變了,進而導致非常嚴重的錯位問題。只要記住,總是在所有命令的最后添加新的命令,就不會引入兼容性問題。具體到數據類型的成員方法,與上面的分種一致,因為它也是使用支持庫中唯一的全局函數表的,但這里引入了一個新的細節,有一個LIB_DATA_TYPE_INFO.m_pnCmdsIndex 用于指定方法在全局函數表中的命令索引,所以通過它可以調整各成員方法的順序,這種做法通常不會引入兼容性問題。

二,為命令增加一個參數,或修改命令的參數

新增加的參數,必須放在所有參數的后面,否則將違反兼容點2,3,4,5;必須允許省略該參數(AS_DEFAULT_VALUE_IS_EMPTY)或該參數有默認值(AS_HAS_DEFAULT_VALUE);同時在編寫代碼讀取該參數值時要小心,須判斷nArgCount和MDATA_INF.m_dtDataType(否則違反兼容點4,5),大致大代如下:

void fn_Global_SetWindowRgn (PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf) { int nArg1 = pArgInf[0].m_int; int nArg2 = pArgInf[1].m_int; //假設第三個參數是新版添加的參數 int nArg3 = 0; if(nArgCount > 2 && pArgInf[2].m_dtDataType != _SDT_NULL) { nArg3 = pArgInf[2].m_int; } //... }

修改一個已有命令的參數時,不能隨便修改數據類型,否則將違反兼容點2,3,4,5,要改也只能改成通用型(同時在代碼中根據參數傳遞來的真實類型(MDATA_INF.m_dtDataType)做相應處理)。參數的名稱和說明,因為都是文本,可以隨便改,有會有兼容性問題,但不要改的意思與原來相反哦(排除原來失誤寫反了的情況),改變參數語義往往會導致代碼改動,進而導致違反兼容點5。

三,為窗口組件增加屬性

新增加的屬性,必須放在已有屬性的后面,否則違反兼容點4,5,因為易語言運行時是通過屬性的索引讀寫屬性值的。然后在序列化屬性值時,提高一個版本號,讀取時先判斷版本,舊版序列化出的數據少,就不能多讀。在此提示,序列化屬性值時,一定要先寫出版本號,如果沒有版本號,后續的兼容性問題多多。

(TODO:這一段另成一文)但即使有了版本號,使用不當,也會導致升級時的麻煩,我前一段就遇到過,代碼有這么一句:if(dwVersion > CURRENT_VER) return FALSE; 版本號比現在能處理的版本號大,出現在什么情況呢,用舊版支持庫打開/運行用新版支持庫編譯的易源程序/程序。返回假是合理的(畢竟不能完全處理這種情況),但是比較粗暴(這意味著無法用舊版支持庫打開用新版支持庫編寫的源程序/程序,這不是向下兼容的問題,是向上兼容的問題),如果能盡量讀取,放棄不能識別的數據,溫和的處理,效果更好。簡單的把這條判斷語句刪除,有用嗎?當然沒用,舊版的支持庫已經在用戶手上了,編譯結果是確定的,你的改動只能體現在新版中,而對舊版無能為力。解決這個問題需要技巧,我采取的方案是,版本號不升反降!即,把CURRENT_VER減小,那么我序列化出的數據,版本號比以前還小,舊版支持庫里的那條判斷(if(dwVersion > CURRENT_VER))就不起作用了,嘿嘿。新的序列化數據版本更低,但寫的數據更多,需要擔心舊版支持庫讀出多余的數據來嗎?當然不用,舊版支持庫的編譯結果和運行結果是確定的。只要新版支持庫中識別出這種情況,不要因為版本號小就認為是舊版就行了,同時后續升級的方便,再引入一個新的版本號,存到原有序列化數據的最后,這樣再次升級時直接判斷新版本號就行了,原有的那套版本號停止使用。這一段有點亂,需整理。

四,為數據類型增加私有成員

如果某個數據類型已經有了一個或多個私有成員,升級時需要增加一個私有成員,該怎么辦,直接在LIB_DATA_TYPE_ELEMENT 數組中添加一項嗎?不行!這樣將違反兼容點4,5,因為對象所占用內存是在由EXE分配的,舊的EXE中只為對象分配了N個成員的空間,而新庫要去訪問第N+1個成員,不就發生內存訪問越界的錯誤了嗎?解決方案是,把原來的N個私有成員連用新增加的成員,集中存儲到一塊新分配的內存中,然后把這個內存地址存儲到原有的第一個私有成員位置上(原有的其它成員位置廢棄不用)。因為即使是舊EXE也會調用新支持庫中的構造函數和析構函數,所以改變私有成員存儲位置不會影響程序的執行。這種方案對代碼的影響是非常大的,需要修改很多地方(所有對私有成員的讀寫),但是為了保證支持庫的向下兼容性,這種付出是值得的。


注:相關教程知識閱讀請移步到易語言教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品福利在线| 欧美激情xxxxx| 日韩亚洲在线观看| 久久久欧美一区二区| 91精品久久久久久综合乱菊| 日韩在线观看视频免费| 国产精品影院在线观看| 国产999在线观看| 95av在线视频| 97精品在线视频| 在线播放日韩av| 国产成人亚洲综合青青| 精品视频—区二区三区免费| 77777少妇光屁股久久一区| 岛国av在线不卡| 精品国产成人在线| 国产精品高清网站| 亚洲精品一区二区久| 日韩一级黄色av| 国产精品三级美女白浆呻吟| 国产精品久久一区| 亚洲欧美另类国产| 中文字幕av一区中文字幕天堂| 亚洲国产精品字幕| 亚洲精品日韩久久久| 国产成人精品久久二区二区91| 91牛牛免费视频| 日本精品久久久久影院| 亚洲欧美日韩一区二区在线| 亚洲变态欧美另类捆绑| 欧美亚洲视频在线看网址| 久久久久久久久电影| 成人黄色免费网站在线观看| 91精品国产综合久久男男| 热re99久久精品国产66热| 日韩av影视综合网| 57pao成人国产永久免费| 亚洲第一天堂无码专区| 大胆欧美人体视频| 亚洲天堂免费观看| 亚洲激情 国产| 国产成人短视频| 久久久人成影片一区二区三区| 国内精品400部情侣激情| 69久久夜色精品国产7777| www日韩中文字幕在线看| 日韩精品免费看| 亚洲国产精品99| 亚洲国产精品久久久久秋霞不卡| 最近免费中文字幕视频2019| 国产精品视频区| 欧美大片网站在线观看| 亚洲最大的网站| 日韩欧美视频一区二区三区| 97在线看福利| 国产精品永久免费视频| 日韩av一区在线观看| 国产精品久久久久久搜索| 国产精品免费观看在线| 成人免费淫片aa视频免费| 欧洲美女免费图片一区| 国产在线精品自拍| 日韩电影在线观看中文字幕| 日韩精品在线视频观看| 亚洲第一国产精品| 色偷偷亚洲男人天堂| 久久视频精品在线| 国产一区二区三区直播精品电影| 国产91精品不卡视频| 欧美一级片免费在线| 欧美亚洲国产日韩2020| 最近2019中文字幕第三页视频| 国产精品jvid在线观看蜜臀| 国产精品精品视频| 国产精品视频久久久| 久久久噜噜噜久久久| 国产成人精品久久二区二区| 欧美激情视频一区二区三区不卡| 欧美日本中文字幕| 亚洲欧美国产精品专区久久| 久久免费少妇高潮久久精品99| 日韩va亚洲va欧洲va国产| 亚洲综合中文字幕在线| 日韩人体视频一二区| 日产精品久久久一区二区福利| 亚洲视频日韩精品| 久久久999国产| 亚洲成av人影院在线观看| 日韩欧美在线视频日韩欧美在线视频| 成人午夜一级二级三级| 亚洲欧美日韩一区二区在线| 亚洲japanese制服美女| 91精品国产91久久久| 免费91在线视频| 亚洲人永久免费| 国产精品亚洲激情| 另类专区欧美制服同性| 亚洲乱亚洲乱妇无码| 欧美激情精品久久久久久黑人| 亚洲天堂色网站| 揄拍成人国产精品视频| 欧美有码在线观看视频| 亚洲欧美日韩爽爽影院| 久久艳片www.17c.com| 亚洲国产精品女人久久久| 国产精品海角社区在线观看| 久久精品91久久香蕉加勒比| 中文字幕亚洲欧美在线| 黑人精品xxx一区一二区| 78m国产成人精品视频| 久久精品中文字幕| 成人久久久久爱| 久久精品国亚洲| 久久亚洲精品毛片| 在线日韩精品视频| 亚洲毛片在线观看| 日韩中文娱乐网| 日韩电视剧在线观看免费网站| 精品亚洲一区二区三区四区五区| 国产精品夜间视频香蕉| 热久久美女精品天天吊色| 久久久在线视频| 精品国产网站地址| 日韩欧美第一页| www.欧美三级电影.com| 欧美精品videos性欧美| 国产69精品久久久| 日韩av电影国产| 亚洲欧美国产视频| 国产精品入口免费视频一| 日韩在线高清视频| 九九精品视频在线| 性日韩欧美在线视频| 亚洲国产97在线精品一区| 欧美福利视频在线观看| 91久久久久久久久久| 欧美国产极速在线| 久久亚洲欧美日韩精品专区| 亚洲老司机av| 中文字幕日韩精品有码视频| 欧美日韩爱爱视频| 麻豆一区二区在线观看| 国产91久久婷婷一区二区| 久久久成人精品视频| 亚洲影院污污.| 亚洲精品720p| 亚洲性av在线| 成人免费视频在线观看超级碰| 日韩成人中文电影| 欧美激情国产高清| 亚洲国产精品专区久久| 国产精品一区专区欧美日韩| 亚洲欧美制服另类日韩| 中文字幕av一区二区| 国产精品免费福利| 亚洲美女免费精品视频在线观看| 亚洲级视频在线观看免费1级| 国产亚洲人成网站在线观看| 日本道色综合久久影院| 久久艹在线视频| 久久久久久久久久久人体| 久久在线观看视频| 91免费国产视频| 国产精品第一第二|