青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Michael's Space

Technology changes the world, serves the people.

COM的由來

Posted on 2006-07-04 17:59 奔跑的阿甘 閱讀(518) 評論(0)  編輯 收藏 引用 所屬分類: COM/ATL
COM的由來
Michael 2006年07月04日

最近,公司的產(chǎn)品在支持SNA網(wǎng)絡(luò)時出現(xiàn)了一個怪異的問題,終端和主機連接總是無法建立,經(jīng)過追查源碼發(fā)現(xiàn)應(yīng)用客戶端在調(diào)用SNA網(wǎng)絡(luò)服務(wù)庫的接口時莫名其妙的改變了網(wǎng)絡(luò)服務(wù)對象的數(shù)據(jù)成員,實際上,該數(shù)據(jù)成員只有在對象構(gòu)造函數(shù)中被初始化過一次,其他地方?jīng)]有任何寫操作。
根據(jù)應(yīng)用客戶端對多網(wǎng)絡(luò)協(xié)議的支持代碼,我做了以下測試,Client應(yīng)用調(diào)用一個Operate接口,由兩個不同的服務(wù)端實現(xiàn):

Client包含IOperator接口文件,調(diào)用operate方法:
1?class?EXPORIMP?IOperator?{
?2?public:
?3?????IOperator();
?4?????~IOperator();
?5?????
?6?????long?operate(const?long?var1,?const?long?var2);
?7?????
?8?private:
?9?????int?a;
10?????int?b;
11?};

operate的第一個實現(xiàn):server1.dll
?
1class?EXPORIMP?IOperator?{
2??public:
3???????IOperator();
4???????~IOperator();
5???????
6???????long?operate(const?long?var1,?const?long?var2);
7???????
8???private:
9??????int?a;
10??????int?b;
11??};

operate的第二個實現(xiàn):增強的server1.dll
?1class?EXPORIMP?IOperator?{
?2?public:
?3?????IOperator(); // Initialize szName, a, b
?4?????~IOperator();
?5?????
?6?????long?operate(const?long?var1,?const?long?var2); //access szName
?7?????
?8?private:
?9?????char?szName[256];
10?????int?a;
11?????int?b;
12?};

client通過server1.lib來實現(xiàn)接口調(diào)用,server1的發(fā)布者在發(fā)布dll后發(fā)現(xiàn)server1中存在某個BUG,或者為了改進operate的效率,因而引入了szName成員并更新了operate接口實現(xiàn),然后重新發(fā)布了增強版的server1 DLL。客戶拿到新版本后很高興,但是,當他興致勃勃地替換掉老的DLL時,發(fā)現(xiàn)自己的客戶端再也跑不起來了,令人厭煩的異常!
我們發(fā)現(xiàn)兩種實現(xiàn)的唯一區(qū)別是私有數(shù)據(jù)成員的組成,但是DLL的PUBLIC接口沒有變化為什么會出現(xiàn)異常呢?
原來,客戶端在第一次編譯時引入老的server1.lib,并沒有準備為新的dll分配256個char變量,但是客戶端調(diào)用的新的dll接口時卻對不屬于自己的內(nèi)存塊做了操作,其實,客戶端在創(chuàng)建IOperator對象時就出錯了!
我們稱以上的接口定義為“老”的接口定義方式,這種方式下,如果改變了數(shù)據(jù)成員而且公用接口對數(shù)據(jù)成員又做了操作,那么在不重新編譯客戶程序的情況下,客戶程序?qū)⒑翢o疑問的出現(xiàn)異常甚至崩潰。

封裝-C++的三大特性之一,在這里迷惑了我們的視眼。因為利用PRIVATE和PUBLIC關(guān)鍵字定義的封裝是“語法”上的封裝,也就是說,在同一工程內(nèi)是不能夠直接訪問PRIVATE的成員的,否則編譯器會報告語法錯誤,實際上,編譯器在編譯重用庫的時候還是需要訪問重用類的所有成員(包括PRIVATE),以便在客戶中構(gòu)造類對象。這樣,“接口”和“實現(xiàn)”實際上是一個東西。
“接口”和“實現(xiàn)”的真正分離,要求C++的“封裝”是種“二進制層次”的封裝。也就是說,不管重用類的實現(xiàn)如何改變,它提供的接口對于客戶來說都是靜止的。因此,我們把接口類和實現(xiàn)類分離的時候,要讓接口類的二進制布局不會隨著實現(xiàn)類的變化而變化。
下述對接口類和實現(xiàn)類的分離是成功的,因為不論實現(xiàn)類如何改進,接口IOperatorItf的內(nèi)存布局從未改變。但是,一個殘酷的問題是,IOperatorItf類必須聲明IOperator的所有擁有的接口,對于一個稍微大型的類來說,這是個煩瑣的過程,而且,嵌套調(diào)用的開銷也不可忽略。
?1?class?EXPORIMP?IOperatorItf?{?? //接口類
?2?class?IOperator;
?3?IOperator*?m_pThis;
?4??public:
?5???????IOperator();
?6???????~IOperator();
?7???????
?8???????long?operate(const?long?var1,?const?long?var2);
?9??};
10?
11?class?EXPORIMP?IOperator?{?? //實現(xiàn)類
12??public:
13???????IOperator();
14???????~IOperator();
15???????
16???????long?operate(const?long?var1,?const?long?var2);
17???????
18???private:
19??????int?a;
20??????int?b;
21??};

這里還有個非常關(guān)鍵的問題,上述改進并沒有解決編譯器/鏈接器的標識符名字改編問題,這造成嚴重的編譯器/鏈接器依賴。
編譯器之間不可避免的在編譯細節(jié)上存在多種差異,然而,有一條特性卻是所有的編譯器都滿足的:“某個給定平臺上的所有C++編譯器都實現(xiàn)了同樣的虛函數(shù)調(diào)用機制”,即對于每個編譯器,類的對象在內(nèi)存中如何表示,以及在運行時虛函數(shù)如何被動態(tài)調(diào)用,都是一樣的。這個特性非常漂亮的解決上述問題。

?1?//接口類
?2?class?IOperatorItf?{
?3??public:
?4???????vritual?long?operate(const?long?var1,?const?long?var2)=0;
?5??};
?6?extern?"C"?IOperatorItf*?CreateOperatorInstance();
?7?
?8?//實現(xiàn)類
?9?class?IOperator?:?public?IOperatorItf?{
10??public:
11???????IOperator() {a=b=1};
12???????~IOperator();
13???????
14???????long?operate(const?long?var1,?const?long?var2) {return (a+b)};
15???????
16???private:
17??????int?a;
18??????int?b;
19??};
20?extern?"C"?IOperatorItf*?CreateOperatorInstance() { return (new IOperator)};

這里,接口類和實現(xiàn)類在定義上是獨立的,但是因為繼承,實現(xiàn)類的內(nèi)存布局是接口類布局的二進制超集,這種“二進制層次”的繼承解決了我們前面幾種方案的所有問題。

“接口”和“實現(xiàn)”的分離是重用組件的核心,當我們學會用虛函數(shù)表來表達我們的接口時,COM已經(jīng)在向我們招手了。

[完]

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲综合精品自拍| 红桃av永久久久| 欧美一区激情| 国产伦精品一区二区三区| 91久久极品少妇xxxxⅹ软件| 国产欧美日韩精品一区| 亚洲欧美日韩精品| 久久精品人人做人人综合| 韩国一区二区三区在线观看| 中日韩高清电影网| 国产精品久久久久久久久久尿 | 久久高清国产| 欧美激情视频一区二区三区不卡| 亚洲福利视频一区| 国产精品v欧美精品v日本精品动漫| 亚洲午夜av在线| 久久一区二区三区超碰国产精品| 一区二区高清在线观看| 精东粉嫩av免费一区二区三区| 欧美日韩国内自拍| 欧美在线视频免费观看| 一区二区三区色| 欧美电影电视剧在线观看| 久久久视频精品| 欧美伊人久久久久久久久影院 | 麻豆精品网站| 久久久久久久久岛国免费| 亚洲无玛一区| 一本大道久久精品懂色aⅴ| 黄色欧美成人| 樱桃成人精品视频在线播放| 国产视频精品免费播放| 国产精品v日韩精品| 欧美午夜在线视频| 国产精品久久久久久亚洲毛片 | 亚洲成人中文| 亚洲国产成人久久综合一区| 一色屋精品视频在线观看网站| 国产欧美日韩激情| 国产一区二区三区久久悠悠色av| 国产精品一区久久久| 国产精品v日韩精品| 国产欧美一区二区精品仙草咪 | 亚洲综合导航| 亚洲天堂偷拍| 性亚洲最疯狂xxxx高清| 久久久久久久精| 亚洲国产三级在线| 亚洲欧美日韩国产| 久久综合狠狠综合久久综合88 | 在线午夜精品自拍| 国产日产欧产精品推荐色| 女生裸体视频一区二区三区| 亚洲日本在线观看| 亚洲一区二区在线免费观看视频| 欧美一区二区三区四区在线 | 免费成人高清在线视频| 欧美午夜电影网| 在线成人h网| 亚洲女人小视频在线观看| 欧美va天堂va视频va在线| 亚洲深夜av| 欧美日本国产| 亚洲经典在线看| 久久久久一区二区三区| 日韩视频在线观看一区二区| 久久婷婷麻豆| 国产欧美日韩一区二区三区在线观看 | 亚洲日本电影在线| 久久一区亚洲| 国产综合香蕉五月婷在线| 宅男噜噜噜66一区二区| 欧美国产激情二区三区| 久久成人18免费观看| 好吊色欧美一区二区三区视频| 亚洲性xxxx| 在线综合亚洲欧美在线视频| 欧美成人精品激情在线观看| 午夜在线精品| 国产精品国产三级国产普通话99| 亚洲毛片在线观看| 日韩网站在线看片你懂的| 免费在线欧美视频| 日韩视频免费观看高清在线视频 | 亚洲国产精品v| 免费人成网站在线观看欧美高清| 欧美一区二区免费观在线| 国产欧美日韩一区二区三区| 久久成人一区| 久久在线视频在线| 宅男精品视频| 欧美亚洲一区二区在线观看| 一区二区三区亚洲| 欧美搞黄网站| 国产伦精品一区二区三区视频黑人| 久久激情婷婷| 欧美波霸影院| 久久9热精品视频| 久久亚洲国产精品日日av夜夜| 亚洲伦理在线免费看| 亚洲视频免费观看| 亚洲国产精品ⅴa在线观看| 一区二区三区免费看| 国产一区二区精品丝袜| 亚洲国产成人不卡| 国产精品一区久久久久| 亚洲国产成人精品久久久国产成人一区| 欧美三级视频在线播放| 久久野战av| 欧美午夜电影在线| 亚洲精品在线观看免费| 亚洲第一精品夜夜躁人人躁| 一区二区三区www| 亚洲日本在线观看| 久久久久久一区二区| 午夜久久影院| 国产精品国产三级国产专区53 | 久久精品中文字幕一区| 中日韩高清电影网| 欧美国产日本在线| 欧美成人在线网站| 韩日成人在线| 久久久久国产精品www| 国产精品无码专区在线观看| 亚洲视频1区| 亚洲一区二区不卡免费| 国产精品进线69影院| 99re视频这里只有精品| 亚洲自拍啪啪| 国产欧美日韩不卡| 久久久久久9999| 亚洲国产欧美日韩另类综合| 日韩视频二区| 国产精品看片你懂得| 欧美一区二区三区在线| 免费高清在线一区| av72成人在线| 国产情人节一区| 欧美大秀在线观看| 亚洲视频导航| 亚洲电影在线免费观看| 亚洲一区二区在线看| 国产日韩欧美三级| 欧美激情一区二区在线 | 国产精品自拍一区| 久久综合影视| 亚洲欧美日韩在线高清直播| 亚洲国产老妈| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲美女福利视频网站| 国产真实乱子伦精品视频| 欧美日韩成人一区| 麻豆av一区二区三区| 一本色道久久99精品综合 | 欧美一区二区三区视频在线| 欧美韩国在线| 另类国产ts人妖高潮视频| 亚洲欧美视频| 一本色道精品久久一区二区三区 | 久久免费视频这里只有精品| av成人老司机| 亚洲美女啪啪| 亚洲欧洲在线看| 狠狠久久婷婷| 很黄很黄激情成人| 欧美日韩亚洲一区| 欧美激情1区2区| 亚洲国产精品va| 看片网站欧美日韩| 久久九九有精品国产23| 亚洲主播在线播放| 亚洲男同1069视频| 亚洲欧美日本另类| 亚洲尤物影院| 午夜精品在线视频| 先锋影音一区二区三区| 午夜免费在线观看精品视频| 国产精品99久久久久久久vr | 久久精品国产久精国产爱| 亚洲免费视频观看| 欧美一区二区三区四区在线观看地址 | 国产麻豆午夜三级精品| 黄色成人av网站| 亚洲美女免费视频| 亚洲欧美视频在线| 老鸭窝91久久精品色噜噜导演| 乱中年女人伦av一区二区| 免费在线观看日韩欧美| 亚洲精品国产精品乱码不99按摩| 99精品视频免费观看| 亚洲在线国产日韩欧美| 欧美永久精品| 欧美精品在线一区| 国产综合网站| 亚洲欧美日韩网| 欧美成人国产一区二区| 中国日韩欧美久久久久久久久| 午夜精品久久久久久久久久久久| 巨乳诱惑日韩免费av| 国产精品色午夜在线观看|