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

Michael's Space

Technology changes the world, serves the people.
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

COM的由來

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

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

Client包含IOperator接口文件,調用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的第一個實現: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的第二個實現:增強的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來實現接口調用,server1的發布者在發布dll后發現server1中存在某個BUG,或者為了改進operate的效率,因而引入了szName成員并更新了operate接口實現,然后重新發布了增強版的server1 DLL。客戶拿到新版本后很高興,但是,當他興致勃勃地替換掉老的DLL時,發現自己的客戶端再也跑不起來了,令人厭煩的異常!
我們發現兩種實現的唯一區別是私有數據成員的組成,但是DLL的PUBLIC接口沒有變化為什么會出現異常呢?
原來,客戶端在第一次編譯時引入老的server1.lib,并沒有準備為新的dll分配256個char變量,但是客戶端調用的新的dll接口時卻對不屬于自己的內存塊做了操作,其實,客戶端在創建IOperator對象時就出錯了!
我們稱以上的接口定義為“老”的接口定義方式,這種方式下,如果改變了數據成員而且公用接口對數據成員又做了操作,那么在不重新編譯客戶程序的情況下,客戶程序將毫無疑問的出現異常甚至崩潰。

封裝-C++的三大特性之一,在這里迷惑了我們的視眼。因為利用PRIVATE和PUBLIC關鍵字定義的封裝是“語法”上的封裝,也就是說,在同一工程內是不能夠直接訪問PRIVATE的成員的,否則編譯器會報告語法錯誤,實際上,編譯器在編譯重用庫的時候還是需要訪問重用類的所有成員(包括PRIVATE),以便在客戶中構造類對象。這樣,“接口”和“實現”實際上是一個東西。
“接口”和“實現”的真正分離,要求C++的“封裝”是種“二進制層次”的封裝。也就是說,不管重用類的實現如何改變,它提供的接口對于客戶來說都是靜止的。因此,我們把接口類和實現類分離的時候,要讓接口類的二進制布局不會隨著實現類的變化而變化。
下述對接口類和實現類的分離是成功的,因為不論實現類如何改進,接口IOperatorItf的內存布局從未改變。但是,一個殘酷的問題是,IOperatorItf類必須聲明IOperator的所有擁有的接口,對于一個稍微大型的類來說,這是個煩瑣的過程,而且,嵌套調用的開銷也不可忽略。
?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?{?? //實現類
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??};

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

?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?//實現類
?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)};

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

“接口”和“實現”的分離是重用組件的核心,當我們學會用虛函數表來表達我們的接口時,COM已經在向我們招手了。

[完]

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   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>
            亚洲激情自拍| 国产伦精品一区二区三区免费| 亚洲精品久久久久中文字幕欢迎你| 亚洲字幕在线观看| 亚洲欧美激情诱惑| 久久精品国产第一区二区三区最新章节| 久久爱另类一区二区小说| 亚洲免费在线观看视频| 久久精品成人| 欧美国产精品va在线观看| 久久中文字幕一区二区三区| 香港久久久电影| 欧美va亚洲va国产综合| 亚洲黄色一区| 一区二区日本视频| 久久国产精品一区二区| 欧美成人免费全部| 欧美电影免费观看高清| 欧美性色视频在线| 激情国产一区二区| 亚洲先锋成人| 欧美高清在线视频| 亚洲精品少妇网址| 久久精品国产77777蜜臀| 久久综合综合久久综合| 欧美区在线播放| 国产精品丝袜久久久久久app| 国产一区日韩欧美| 亚洲精品在线视频| 欧美一区成人| 亚洲盗摄视频| 亚洲一区二区免费看| 久久国产精品99国产| 欧美日韩成人在线视频| 韩日午夜在线资源一区二区| 中文国产一区| 亚洲国产成人精品久久久国产成人一区| 亚洲一区高清| 欧美大片国产精品| 国产日韩一区二区| 正在播放欧美视频| 欧美电影打屁股sp| 性欧美1819性猛交| 国产精品久久久久毛片大屁完整版 | 欧美岛国激情| 狠狠综合久久av一区二区小说| 夜夜狂射影院欧美极品| 女女同性精品视频| 香蕉成人伊视频在线观看| 欧美日韩成人一区二区| 最新国产乱人伦偷精品免费网站| 久久精品国产亚洲一区二区三区| 99精品视频免费观看| 久久综合久久综合九色| 国产亚洲人成a一在线v站| 欧美+亚洲+精品+三区| 极品尤物av久久免费看| 欧美一区二区三区男人的天堂| 亚洲精品视频在线| 欧美精品三级日韩久久| 亚洲免费观看| 亚洲黄色有码视频| 欧美a级一区| 亚洲国产精品一区在线观看不卡 | 欧美在线视频免费| 亚洲一级黄色| 国产精品久久久久久久久免费| 日韩一级在线观看| 亚洲精品国产精品乱码不99| 欧美精品一区二区三区视频| 亚洲毛片播放| 日韩午夜av电影| 欧美视频在线观看一区| 亚洲欧美激情一区| 久久高清福利视频| 亚洲精品123区| 日韩一区二区久久| 国产精品无码永久免费888| 久久精视频免费在线久久完整在线看| 久久久999国产| 99v久久综合狠狠综合久久| aⅴ色国产欧美| 国产日韩欧美夫妻视频在线观看| 久久成人精品无人区| 久久中文久久字幕| 一区二区三区视频在线| 久久久噜噜噜久久| 久久久久久久综合色一本| 欧美专区在线| 在线成人国产| 亚洲精品在线视频观看| 国产日韩精品一区二区三区在线| 玖玖视频精品| 欧美日韩一卡| 久久久久这里只有精品| 欧美激情按摩| 久久精品中文字幕一区| 欧美精品二区| 久久免费精品视频| 欧美日韩高清区| 久久综合九色综合欧美狠狠| 欧美高清自拍一区| 久久电影一区| 欧美日韩精品免费观看视一区二区 | 亚洲精品免费一二三区| 国产精品素人视频| 老牛影视一区二区三区| 欧美午夜视频网站| 久热综合在线亚洲精品| 欧美性猛交视频| 欧美成人视屏| 国产欧美日韩精品一区| 日韩视频免费大全中文字幕| 国产日韩欧美在线观看| 亚洲久久成人| 91久久午夜| 久久久久久成人| 久久精品国产99国产精品澳门| 欧美另类高清视频在线| 欧美电影免费| 伊人久久久大香线蕉综合直播| 亚洲视频图片小说| 99re视频这里只有精品| 久久久久久一区| 久久久久综合一区二区三区| 国产精品欧美在线| 日韩亚洲国产精品| 日韩视频第一页| 亚洲视频精选在线| 亚洲一区二区欧美| 欧美劲爆第一页| 亚洲一区久久| 亚洲欧美视频在线观看| 欧美午夜精品久久久久久久| 亚洲精品网站在线播放gif| 亚洲国产va精品久久久不卡综合| 欧美一区二区三区四区在线观看地址| 欧美一区午夜精品| 欧美精品一区二区精品网| 亚洲人成网站影音先锋播放| 一区二区视频免费完整版观看| 久久精品视频免费| 久久久91精品国产一区二区三区| 国产日韩欧美在线| 久久久久国产精品午夜一区| 久久亚洲欧美| 亚洲成人中文| 欧美激情1区2区| 日韩午夜免费视频| 一本色道久久88综合日韩精品 | 久久一区中文字幕| 免费看亚洲片| 亚洲激情网站| 欧美成人亚洲成人日韩成人| 欧美成人一二三| 最新亚洲电影| 欧美日韩久久精品| 亚洲图片你懂的| 欧美影院一区| 狠狠色综合日日| 欧美电影美腿模特1979在线看 | 久久久久成人网| 欧美成人精品在线视频| 亚洲毛片播放| 国产精品视频网| 久久电影一区| 亚洲第一黄色网| 亚洲一区二区成人在线观看| 国产精品一区二区三区成人| 久久成人精品电影| 亚洲激情国产精品| 欧美一站二站| 亚洲美女在线观看| 亚洲视频大全| 免费在线看一区| 亚洲午夜羞羞片| 在线观看成人小视频| 欧美激情自拍| 日韩亚洲欧美中文三级| 欧美在线观看你懂的| 亚洲日本欧美天堂| 国产精品二区在线| 欧美aa在线视频| 亚洲欧美国产日韩中文字幕| 欧美高潮视频| 久久精品国产精品亚洲综合| 99国产精品99久久久久久| 国产欧美精品| 国产精品高潮在线| 欧美激情2020午夜免费观看| 久久精品视频免费| 亚洲欧美制服另类日韩| 亚洲国产精品第一区二区| 亚洲视频在线看| 亚洲国产高清一区二区三区| 国产精品第三页| 欧美伦理a级免费电影| 亚洲二区在线| 久久免费少妇高潮久久精品99| 一区二区三区不卡视频在线观看|