亚洲免费乱码视频,日韩 欧美 国产 动漫 一区,97在线观看免费视频播国产,中文字幕亚洲图片

      1. <legend id="ppnor"></legend>

      2. 
        
        <sup id="ppnor"><input id="ppnor"></input></sup>
        <s id="ppnor"></s>

        用VC進(jìn)行COM編程所必須掌握的理論知識(shí)

        字號(hào):

        這篇文章是給初學(xué)者看的,盡量寫(xiě)得比較通俗易懂,并且盡量避免編程細(xì)節(jié)。完全是根據(jù)我自己的學(xué)習(xí)體會(huì)寫(xiě)的,其中若有技術(shù)上的錯(cuò)誤之處,請(qǐng)大家多多指正。
            一、為什么要用COM
             軟件工程發(fā)展到今天,從一開(kāi)始的結(jié)構(gòu)化編程,到面向?qū)ο缶幊蹋俚浆F(xiàn)在的COM編程,目標(biāo)只有一個(gè),就是希望軟件能象積方塊一樣是累起來(lái)的,是組裝起來(lái)的,而不是一點(diǎn)點(diǎn)編出來(lái)的。結(jié)構(gòu)化編程是函數(shù)塊的形式,通過(guò)把一個(gè)軟件劃分成許多模塊,每個(gè)模塊完成各自不同的功能,盡量做到高內(nèi)聚低藕合,這已經(jīng)是一個(gè)很好的開(kāi)始,我們可以把不同的模塊分給不同的人去做,然后合到一塊,這已經(jīng)有了組裝的概念了。軟件工程的核心就是要模塊化,最理想的情況就是100%內(nèi)聚0%藕合。整個(gè)軟件的發(fā)展也都是朝著這個(gè)方向走的。結(jié)構(gòu)化編程方式只是一個(gè)開(kāi)始。下一步就出現(xiàn)了面向?qū)ο缶幊?,它相?duì)于面向功能的結(jié)構(gòu)化方式是一個(gè)巨大的進(jìn)步。我們知道整個(gè)自然界都是由各種各樣不同的事物組成的,事物之間存在著復(fù)雜的千絲萬(wàn)縷的關(guān)系,而正是靠著事物之間的聯(lián)系、交互作用,我們的世界才是有生命力的才是活動(dòng)的。我們可以認(rèn)為在自然界中事物做為一個(gè)概念,它是穩(wěn)定的不變的,而事物之間的聯(lián)系是多變的、運(yùn)動(dòng)的。事物應(yīng)該是這個(gè)世界的本質(zhì)所在。面向?qū)ο蟮闹埸c(diǎn)就是事物,就是這種穩(wěn)定的概念。每個(gè)事物都有其固有的屬性,都有其固有的行為,這些都是事物本身所固有的東西,而面向?qū)ο蟮姆椒ň褪敲枋龀鲞@種穩(wěn)定的東西。而面向功能的模塊化方法它的著眼點(diǎn)是事物之間的聯(lián)系,它眼中看不到事物的概念它只注重功能,我們平常在劃分模塊的時(shí)侯有沒(méi)有想過(guò)這個(gè)函數(shù)與哪些對(duì)象有關(guān)呢?很少有人這么想,一個(gè)函數(shù)它實(shí)現(xiàn)一種功能,這個(gè)功能必定與某些事物想聯(lián)系,我們沒(méi)有去掌握事物本身而只考慮事物之間是怎么相互作用而完成一個(gè)功能的。說(shuō)白了,這叫本末倒置,也叫急功近利,因?yàn)椴皇俏覀冎腔鄄粔?,只是因?yàn)槲覀儧](méi)有多想一步。面向功能的結(jié)構(gòu)化方法因?yàn)樗⒁獾闹皇鞘挛镏g的聯(lián)系,而聯(lián)系是多變的,事物本身可能不會(huì)發(fā)生大的變化,而聯(lián)系則是很有可能發(fā)生改變的,聯(lián)系一變,那就是另一個(gè)世界了,那就是另一種功能了。如果我們用面向?qū)ο蟮姆椒?,我們就可以以不變?yīng)萬(wàn)變,只要事先把事物用類描述好,我們要改變的只是把這些類聯(lián)系起來(lái)的方法,只是重新使用我們的類庫(kù),而面向過(guò)程的方法因?yàn)樗鼧?gòu)造的是一個(gè)不穩(wěn)定的世界,所以一點(diǎn)小小的變化也可能導(dǎo)致整個(gè)系統(tǒng)都要改變。然而面向?qū)ο蠓椒ㄈ匀挥袉?wèn)題,問(wèn)題在于重用的方法。搭積木式的軟件構(gòu)造方法的基礎(chǔ)是有許許多多各種各樣的可重用的部件、模塊。我們首先想到的是類庫(kù),因?yàn)槲覀冇妹嫦驅(qū)ο蟮姆椒óa(chǎn)生的直接結(jié)果就是許多的類。但類庫(kù)的重用是基于源碼的方式,這是它的重大缺陷。首先它限制了編程語(yǔ)言,你的類庫(kù)總是用一種語(yǔ)言寫(xiě)的吧,那你就不能拿到別的語(yǔ)言里用了。其次你每次都必須重新編譯,只有編譯了才能與你自己的代碼結(jié)合在一起生成可執(zhí)行文件。在開(kāi)發(fā)時(shí)這倒沒(méi)什么,關(guān)鍵在于開(kāi)發(fā)完成后,你的EXE都已經(jīng)生成好了,如果這時(shí)侯你的類庫(kù)提供廠商告訴你他們又做好了一個(gè)新的類庫(kù),功能更強(qiáng)大速度更快,而你為之心動(dòng)又想把這新版的類庫(kù)用到你自己的程序中,那你就必須重新編譯、重新調(diào)試!這離我們理想的積木式軟件構(gòu)造方法還有一定差距,在我們的設(shè)想里希望把一個(gè)模塊拿出來(lái)再換一個(gè)新的模塊是非常方便的事,可是現(xiàn)在不但要重新編譯,還要冒著很大的風(fēng)險(xiǎn),因?yàn)槟憧赡芤匦赂淖兡阕约旱拇a。另一種重用方式很自然地就想到了是DLL的方式。Windows里到處是DLL,它是Windows 的基礎(chǔ),但DLL也有它自己的缺點(diǎn)。總結(jié)一下它至少有四點(diǎn)不足。(1)函數(shù)重名問(wèn)題。DLL里是一個(gè)一個(gè)的函數(shù),我們通過(guò)函數(shù)名來(lái)調(diào)用函數(shù),那如果兩個(gè)DLL里有重名的函數(shù)怎么辦?(2)各編譯器對(duì)C++函數(shù)的名稱修飾不兼容問(wèn)題。對(duì)于C++函數(shù),編譯器要根據(jù)函數(shù)的參數(shù)信息為它生成修飾名,DLL庫(kù)里存的就是這個(gè)修飾名,但是不同的編譯器產(chǎn)生修飾的方法不一樣,所以你在VC 里編寫(xiě)的DLL在BC里就可以用不了。不過(guò)也可以用extern “C“;來(lái)強(qiáng)調(diào)使用標(biāo)準(zhǔn)的C函數(shù)特性,關(guān)閉修飾功能,但這樣也喪失了C++的重載多態(tài)性功能。(3)路徑問(wèn)題。放在自己的目錄下面,別人的程序就找不到,放在系統(tǒng)目錄下,就可能有重名的問(wèn)題。而真正的組件應(yīng)該可以放在任何地方甚至可以不在本機(jī),用戶根本不需考慮這個(gè)問(wèn)題。(4)DLL與EXE的依賴問(wèn)題。我們一般都是用隱式連接的方式,就是編程的時(shí)侯指明用什么DLL,這種方式很簡(jiǎn)單,它在編譯時(shí)就把EXE與DLL綁在一起了。如果DLL發(fā)行了一個(gè)新版本,我們很有必要重新鏈接一次,因?yàn)镈LL里面函數(shù)的地址可能已經(jīng)發(fā)生了改變。DLL的缺點(diǎn)就是COM的優(yōu)點(diǎn)。首先我們要先把握住一點(diǎn),COM和DLL一樣都是基于二進(jìn)制的代碼重用,所以它不存在類庫(kù)重用時(shí)的問(wèn)題。另一個(gè)關(guān)鍵點(diǎn)是,COM本身也是DLL,既使是ActiveX控件.ocx它實(shí)際上也是DLL,所以說(shuō)DLL在還是有重用上有很大的優(yōu)勢(shì),只不過(guò)我們通過(guò)制訂復(fù)雜的COM協(xié)議,通COM本身的機(jī)制改變了重用的方法,以一種新的方法來(lái)利用DLL,來(lái)克服DLL本身所固有的缺陷,從而實(shí)現(xiàn)更高一級(jí)的重用方法。COM沒(méi)有重名問(wèn)題,因?yàn)楦静皇峭ㄟ^(guò)函數(shù)名來(lái)調(diào)用函數(shù),而是通過(guò)虛函數(shù)表,自然也不會(huì)有函數(shù)名修飾的問(wèn)題。路徑問(wèn)題也不復(fù)存在,因?yàn)槭峭ㄟ^(guò)查注冊(cè)表來(lái)找組件的,放在什么地方都可以,即使在別的機(jī)器上也可以。也不用考慮和EXE的依賴關(guān)系了,它們二者之間是松散的結(jié)合在一起,可以輕松的換上組件的一個(gè)新版本,而應(yīng)用程序混然不覺(jué)。