?? 205001.htm
字號(hào):
<html><body><span id=Layer1><p><font size=2 color=#3c3c3c face=arial>對(duì)於Microsoft Windows 2000,沒有任何軟體開發(fā)技術(shù)比元件物件模型還要更基本的了。幾乎每個(gè)在這個(gè)平臺(tái)上或Microsoft其它作業(yè)系統(tǒng)上撰寫的應(yīng)用程式都會(huì)使用COM。即使跨多個(gè)系統(tǒng)執(zhí)行的應(yīng)用程式也能使用增強(qiáng)型式的COM,就是所謂的分散式的COM(Distributed COM,DCOM)。</span><span id=Layer2></font></p><p><font size=2 color=#3c3c3c face=arial>為Windows 2000撰寫軟體表示使用COM</span><span id=Layer3></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>為Windows 2000撰寫軟體表示使用COM</span><span id=Layer4></font></p><hr><p><font size=2 color=#3c3c3c face=arial>Windows 2000引進(jìn)了COM+,它是這個(gè)核心技術(shù)的延伸版本。本章將詳細(xì)地介紹COM的基本,大部份的技術(shù)和COM+是一樣沒有改變的。若要詳細(xì)了解COM+的特性,可參考</span><span id=Layer5> <a target='_new' href=208.htm#>第八章</span><span id=Layer6></a> 。</span><span id=Layer7></font></p><a name=205001><font color=#3e70d7 face=arial size=5><b>了解COM物件</span><span id=Layer8></b></font><p><font size=2 color=#3c3c3c face=arial>在COM中,客戶端存取COM物件所提供的服務(wù)。第一個(gè)該回答的問題便是:什麼是一個(gè)COM物件?就像其它的類型的物件一樣,一個(gè)COM物件就是一個(gè)抽象的軟體,封裝兩個(gè)東西:資料與method。一個(gè)物件的資料,也稱為它的狀態(tài),就是指物件儲(chǔ)存在記憶體中的資訊,而它的method就是它的程式碼,允許物件提供它的服務(wù)。舉例來說,一個(gè)COM物件允許銷售員開出的訂單內(nèi)包含訂單明細(xì)資料,這些資料是訂單的一部份,以及訂單建立的時(shí)間。這個(gè)物件的method包含將訂單項(xiàng)目加到訂單、提交訂單、判斷訂單建立的時(shí)間...等等方法。</span><span id=Layer9></font></p><p><font size=2 color=#3c3c3c face=arial>一個(gè)COM物件有兩樣?xùn)|西:資料和method</span><span id=Layer10></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>一個(gè)COM物件有兩樣?xùn)|西:資料和method</span><span id=Layer11></font></p><hr><p><font size=2 color=#3c3c3c face=arial>就類似在程式語(yǔ)言中的method一樣,一個(gè)COM物件的method可以擁有參數(shù)。舉例來說,一個(gè)新增一個(gè)項(xiàng)目到訂單的method可能夾帶一個(gè)整數(shù)參數(shù),其中包含欲新增訂單項(xiàng)目的數(shù)量。在COM中,method必須組成介面,而每個(gè)COM物件都要實(shí)作一些介面。(實(shí)際上數(shù)目上總是超過一個(gè),理由稍後再解釋。)舉例來說,剛提及的訂單物件可能會(huì)將所有建立一份訂單用到的所有method組成一個(gè)介面,所有用來處理與訂單相關(guān)資訊的method,如建立訂單,可能會(huì)組成第二個(gè)介面。介面只顯露一個(gè)物件的method,資料已封裝,只能透過物件實(shí)作的介面中的method存取。如</span><span id=Layer12> <a target='_new' href=201.htm#>第一章</span><span id=Layer13></a> 所展示的一樣,物件提供的每一個(gè)介面在慣例上是使用一個(gè)小圈圈連結(jié)到一個(gè)物件來表示。</span><span id=Layer14></font></p><p><font size=2 color=#3c3c3c face=arial>許多Method組成許多介面</span><span id=Layer15></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>許多Method組成許多介面</span><span id=Layer16></font></p><hr><p><font size=2 color=#3c3c3c face=arial>每個(gè)COM物件都有一個(gè)或多個(gè)客戶端使用它的服務(wù)之軟體。若要存取一個(gè)物件的服務(wù),客戶端必須呼叫物件所提供的method。在呼叫特定介面上的method之前,客戶端必須要求指向那個(gè)介面的介面指標(biāo)。一切端賴客戶端所使用的程式開發(fā)語(yǔ)言的不同,客戶端不一定可以看到真正的指標(biāo);不過不管它看起來像什麼樣子,它允許客戶端呼叫它所參考到的介面內(nèi)的method。就如圖5-1中顯示,客戶端握住同一個(gè)COM物件的多個(gè)介面指標(biāo)是很平常的事,每一個(gè)介面一個(gè)指標(biāo),指向它欲呼叫的介面。</span><span id=Layer17></font></p><p><font size=2 color=#3c3c3c face=arial>客戶端使用介面指標(biāo)呼叫method</span><span id=Layer18></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>客戶端使用介面指標(biāo)呼叫method</span><span id=Layer19></font></p><hr><br><center><a target=_new href=imagesh/5-1.gif><img border=0 src='imagesl/5-1.gif'></a></center></span><span id=Layer20><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b> 圖5-1</span><span id=Layer21> </b></font>若要呼叫特定介面上的method,客戶端必須握住指向那個(gè)介面的介面指標(biāo)。</span><span id=Layer22></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>在更深入探討介面之前,得要強(qiáng)調(diào)一下COM物件可以使用許多不同的程式開發(fā)語(yǔ)言建立。事實(shí)上,一個(gè)COM物件與它的客戶端可能,或者也可能不是以同一種程式語(yǔ)言寫成的。因?yàn)镃OM定義了與語(yǔ)言獨(dú)立的一種標(biāo)準(zhǔn),以供客戶端和物件進(jìn)行互動(dòng)。COM程式設(shè)計(jì)師最普遍的選擇便是Microsoft Visual Basic、C++與Java,但現(xiàn)在幾乎所有在Windows 2000上與Microsoft其它作業(yè)系統(tǒng)的開發(fā)工具都能夠支援COM。這叁種最流行的語(yǔ)言每一種都對(duì)物件有自己的解釋。這些概念幾乎是很類似的,也和COM對(duì)物件的定義相近,但是它們并不是完全相同。撰寫使用COM的軟體需要了解COM對(duì)物件的觀點(diǎn):它們都是相同的,不管使用的程式語(yǔ)言是哪一種,然後看看這些觀點(diǎn)要如何對(duì)應(yīng)到特定的程式語(yǔ)言。</span><span id=Layer23></font></p><p><font size=2 color=#3c3c3c face=arial>COM物件可讓許多不同的程式開發(fā)語(yǔ)言使用</span><span id=Layer24></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>COM物件可讓許多不同的程式開發(fā)語(yǔ)言使用</span><span id=Layer25></font></p><hr><p><font size=2 color=#3c3c3c face=arial>不用太訝異,C++的程式設(shè)計(jì)師要了解的最詳細(xì),如果選擇使用COM的話,就得很痛苦地了解COM的低階部份。他們也可以使用高階的開發(fā)工具,如現(xiàn)在流行的Microsoft ActiveX Template Library (ATL) 來隱藏許多的細(xì)節(jié)。對(duì)照之下,對(duì)Visual Basic的程式設(shè)計(jì)師而言,COM的細(xì)節(jié)已完全隱藏起來了。因此在Visual Basic中使用COM就變得很簡(jiǎn)單,但有時(shí)也令人很 氣。Visual Basic/COM的對(duì)照不見得都相同。最後,很意外地,Java對(duì)物件原生的觀點(diǎn)和COM非常類似。Microsoft的Java virtual machine (JVM)的偉大功勛便是支援Java物件到COM物件直接的對(duì)應(yīng),反之亦然。若使用Microsoft JVM,Java可能是COM程式設(shè)計(jì)師最自然的語(yǔ)言,為的就是這兩類物件最簡(jiǎn)單直覺的對(duì)應(yīng)關(guān)系了。</span><span id=Layer26></font></p><font color=#3e72d7 face=arial size=4><b>介面(Interface)</span><span id=Layer27></b></font><p><font size=2 color=#3c3c3c face=arial>在COM中,整體看來一個(gè)客戶端從來就不會(huì)握住一個(gè)正在執(zhí)行的物件之參考。而是客戶端盡透過呼叫介面指標(biāo)來呼叫物件的method與其互動(dòng)。從客戶端的觀點(diǎn),一個(gè)COM物件主要可視為一群介面的集合。不管用來撰寫物件的語(yǔ)言為何,COM介面永遠(yuǎn)符合一個(gè)定義在記憶體中的結(jié)構(gòu)。為了讓客戶端呼叫物件上的method,透過正確的記憶體布局,COM讓使用某一種語(yǔ)言撰寫的COM物件和其它語(yǔ)言寫的物件相互溝通。</span><span id=Layer28></font></p><p><font size=2 color=#3c3c3c face=arial>COM定義介面在記憶體中的結(jié)構(gòu)</span><span id=Layer29></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>COM定義介面在記憶體中的結(jié)構(gòu)</span><span id=Layer30></font></p><hr><p><font size=2 color=#3c3c3c face=arial><font size=2 face=arial color=#3e80d7><b> 介面的類型</span><span id=Layer31> </b></font>在一個(gè)完美的世界,一個(gè)介面的樣式可以用在所有客戶端與物件的組合。然而在不完美的世界里,COM的存在就不是那麼回事了,因此便存在著叁種不同類型的COM介面。在COM的演進(jìn)過程中,每一種介面都是為了特殊的理由存在的,如果COM是在今天建立的,那麼這些差異點(diǎn)可能就不存在了。</span><span id=Layer32></font></p><p><font size=2 color=#3c3c3c face=arial>COM擁有叁種類型的介面</span><span id=Layer33></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>COM擁有叁種類型的介面</span><span id=Layer34></font></p><hr><p><font size=2 color=#3c3c3c face=arial>第一個(gè)選擇,vtable介面,最原始是為C++設(shè)計(jì)的。也就是所謂的自訂介面,它們記憶體中的結(jié)構(gòu)映照到流行的C++編譯器中method呼叫的方式(包含Microsoft Visual C++)。如此在C++中實(shí)作vtable介面的動(dòng)作就變得相當(dāng)簡(jiǎn)單,并能很有效地透過vtable介面呼叫C++撰寫的物件之method。</span><span id=Layer35></font></p><p><font size=2 color=#3c3c3c face=arial>第一種介面類型,vtable介面,最初是為C++定義的</span><span id=Layer36></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>第一種介面類型,vtable介面,最初是為C++定義的</span><span id=Layer37></font></p><hr><p><font size=2 color=#3c3c3c face=arial>今天,vtable介面也能夠很簡(jiǎn)單、快速,并普遍地在Visual Basic與Java中使用。不過當(dāng)COM在1993年初次發(fā)表時(shí),vtable介面并不適合Visual Basic使用。還有一點(diǎn),Visual Basic程式在呼叫使用C++導(dǎo)向的介面結(jié)構(gòu)之method時(shí)仍有一些挑戰(zhàn)。不過對(duì)Visual Basic來說這不是vtable介面帶來的唯一問題。對(duì)任何技術(shù)來說,還有一個(gè)更棘手的問題,便是如何讓以不同程式語(yǔ)言撰寫的客戶端與物件互動(dòng):如何轉(zhuǎn)換某種語(yǔ)言的資料型態(tài)到另一種語(yǔ)言定義的資料型態(tài)呢?假設(shè)一個(gè)使用C++撰寫的物件將要給Visual Basic客戶端使用,那麼若這個(gè)物件介面中其中一個(gè)method實(shí)作時(shí),以一個(gè)指標(biāo)當(dāng)做參數(shù),這會(huì)發(fā)生什麼事? Visual Basic并不支援指標(biāo),因此要從Visual Basic客戶端呼叫這個(gè)method便成為一件不可能的事。當(dāng)兩個(gè)語(yǔ)言牽涉到兩者都支援一種特殊的資料型態(tài),但卻以不同的方式來處理時(shí),一個(gè)更微妙但無傷大雅的問題就發(fā)生了。舉例來說,C++與Visual Basic兩者都支援字元字串,不過它們處理字串的方式卻有天壤之別。這些問題該怎麼解決呢?</span><span id=Layer38></font></p><p><font size=2 color=#3c3c3c face=arial>COM一開始的答案便是定義第二類型的介面,通常稱為分派介面(dispatch interface),但更常被稱為dispinterface。dispinterface可讓Visual Basic程式能夠有效地實(shí)作COM物件,并能扮演COM物件的客戶端。Dispinterface在記憶體中的結(jié)構(gòu)與vtable的結(jié)構(gòu)有一些不同,以便讓Visual Basic更容易呼叫method。(事實(shí)上,每個(gè)dispinterface依賴於一個(gè)特定的vtable介面,稱IDispatch。)同樣地,在dispinterface中,method的參數(shù)只限定於某些資料型態(tài)。和vtable介面不一樣的地方在於,vtable介面的method能接受的參數(shù)是限定在C++中定義的型態(tài);dispinterface的資料型態(tài)基本上只限制於Visual Basic中可用的(雖然dispinterface同樣也可以在Java中使用)。因?yàn)槭褂胐ispinterface有時(shí)也稱做自動(dòng)化(automation),所以一個(gè)介面的參數(shù)型態(tài)如果遵循這個(gè)限制就可稱為自動(dòng)化相容(automation-compatible)。</span><span id=Layer39></font></p><p><font size=2 color=#3c3c3c face=arial>第二個(gè)介面類型,dispin-terface,一開始是為了Visual Basic而定義的</span><span id=Layer40></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>第二個(gè)介面類型,dispin-terface,一開始是為了Visual Basic而定義的</span><span id=Layer41></font></p><hr><p><font size=2 color=#3c3c3c face=arial>當(dāng)參數(shù)傳送到一個(gè)dispinterface method,或從這個(gè)method傳出時(shí),這些參數(shù)都是包裝成一個(gè)或多個(gè)Variant。一個(gè)Variant包含任何自動(dòng)化相容型態(tài)的值,同樣的也包含一個(gè)指示,指明它的資料型態(tài)。舉例來說,一個(gè)特定的Variant可能包含某些整數(shù)值,以及一個(gè)標(biāo)注(Tag)指明它的資料是一個(gè)長(zhǎng)整數(shù)。Variant對(duì)於Visual Basic程式設(shè)計(jì)師來說是很方便的,Visual Basic會(huì)為你進(jìn)行所有將參數(shù)轉(zhuǎn)換成這個(gè)格式的動(dòng)作,反之亦然。</span><span id=Layer42></font></p><p><font size=2 color=#3c3c3c face=arial>今天,Visual Basic又提升了,它現(xiàn)在可以讓Visual Basic的客戶端使用vtable,以及這些自動(dòng)化相容的介面來存取或?qū)嵶鰿OM物件。而第叁種可用的介面是,Dual Interface。一個(gè)Dual Interface基本上將vtable與dispinterface在記憶體中的結(jié)構(gòu)組合在一起,允許使用任一種介面的樣式來呼叫method。然而dual Interface仍是自動(dòng)化相容的,以便適用於Visual Basic與Java。事實(shí)上,使用Visual Basic建立的COM物件預(yù)設(shè)便是使用dual Interface來顯露它們的method。</span><span id=Layer43></font></p><p><font size=2 color=#3c3c3c face=arial>第叁個(gè)介面類型,dual interface,合并了前兩種介面類型</span><span id=Layer44></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>第叁個(gè)介面類型,dual interface,合并了前兩種介面類型</span><span id=Layer45></font></p><hr><p><font size=2 color=#3c3c3c face=arial><font size=2 face=arial color=#3e80d7><b> 辨識(shí)介面</span><span id=Layer46> </b></font>若要呼叫特定介面上的method,客戶端必須取得指向某個(gè)執(zhí)行中的COM物件其介面的指標(biāo)。正確完成這個(gè)動(dòng)作的過程將於稍後描述,不過很明顯的,客戶端若要取得這個(gè)指標(biāo)得靠某些方式來辨識(shí)自己感興趣的介面。換句話說,介面必須擁有名稱。</span><span id=Layer47></font></p><p><font size=2 color=#3c3c3c face=arial>每一個(gè)介面要有名稱</span><span id=Layer48></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>每一個(gè)介面要有名稱</span><span id=Layer49></font></p><hr><p><font size=2 color=#3c3c3c face=arial>在COM中,每個(gè)介面都擁有兩個(gè)名稱。其中一個(gè)名稱是讓人使用的,因此它只是一個(gè)字元字串。根據(jù)命名原則,COM介面的名稱都是以字母「I」開始的。舉例來說,前面提到的訂單物件可能有一個(gè)類似IOrderEntry與IOrderStatistics的名稱。當(dāng)你談?wù)摰紺OM物件,第一種樣式的名稱讓人很容易記得。</span><span id=Layer50></font></p><p><font size=2 color=#3c3c3c face=arial>人類可以讀取的介面通常以「I」開頭</span><span id=Layer51></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>人類可以讀取的介面通常以「I」開頭</span><span id=Layer52></font></p><hr><p><font size=2 color=#3c3c3c face=arial>然而,這類介面的名稱并不是唯一的。有可能兩個(gè)不同的人(也完全地合法)定義兩個(gè)不同的介面,而名稱都是稱為,IMyInterface。為了要取得正確介面的介面指標(biāo),客戶端必須有某種方式來區(qū)分某個(gè)特定的介面。因此,每一個(gè)介面都需要有一個(gè)唯一可供辨別的名稱。</span><span id=Layer53></font></p><p><font size=2 color=#3c3c3c face=arial>因?yàn)榈诙惖拿Q必需是唯一的,對(duì)使用者來說它并沒有太親切的名稱,它是要讓軟體使用的。因此每一個(gè)COM介面都指派一個(gè)值,也就是所謂的全域唯一識(shí)別碼(Universally Unique Identifier,UUID)或稱Globally Unique Identifier (GUID)。(這些術(shù)語(yǔ)通常交互使用,不過在本書中主要使用的是後者。) GUID是一個(gè)16位元組的值,在時(shí)間與空間上都是唯一的。指定到一個(gè)特定介面的GUID就是所謂的介面識(shí)別碼(interface identifier,IID)。一旦一個(gè)IID(也就是一個(gè)GUID)指定到一個(gè)介面,這個(gè)IID就可以永遠(yuǎn)用來辨識(shí)這個(gè)介面。</span><span id=Layer54></font></p><p><font size=2 color=#3c3c3c face=arial>每個(gè)介面也擁有一個(gè)全域唯一的IID</span><span id=Layer55></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>每個(gè)介面也擁有一個(gè)全域唯一的IID</span><span id=Layer56></font></p><hr><p><font size=2 color=#3c3c3c face=arial>因?yàn)镚UID是全域唯一的,所以每當(dāng)你要定義一個(gè)新介面時(shí),不能單單只產(chǎn)生一個(gè)GUID。有許多不同的方式可以取得GUID。最困難也最不常用的方式便是從Microsoft要求一個(gè)GUID。最簡(jiǎn)單的方式便是在你的電腦上執(zhí)行一個(gè)簡(jiǎn)單的軟體工具。每當(dāng)使用這個(gè)工具時(shí),它便會(huì)產(chǎn)生一個(gè)新的GUID,而且保證是全域唯一的。GUID另一個(gè)重要的應(yīng)用是當(dāng)做IID,它們也可以用來當(dāng)做其他東西的命名,我們將會(huì)看得到的。</span><span id=Layer57></font></p><p><font size=2 color=#3c3c3c face=arial>GUID一向都是使用軟體工具建立的</span><span id=Layer58></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>GUID一向都是使用軟體工具建立的</span><span id=Layer59></font></p><hr><p><font size=2 color=#3c3c3c face=arial>為何能讓在不同臺(tái)機(jī)器上獨(dú)立執(zhí)行的相同軟體,確能夠確保軟體產(chǎn)生的值都不相同呢?答案就在GUID所包含的東西。它的主要組成份子包含一個(gè)時(shí)間戳記(timestamp)指明建立的時(shí)間,以及安裝在GUID產(chǎn)生的這臺(tái)電腦之網(wǎng)路卡的Medium Access Control (MAC)位址。 時(shí)間戳記能確保在這臺(tái)機(jī)器上產(chǎn)生的每個(gè)GUID都是不同的,而MAC位址確保兩個(gè)同時(shí)產(chǎn)生的GUID不會(huì)相同,因?yàn)镸AC位址是由一個(gè)集中的機(jī)構(gòu)制定,每塊網(wǎng)卡的MAC位址在這個(gè)世界上都是唯一的。這使得GUID的產(chǎn)生相當(dāng)容易,但仍可以確保唯一性。若要論及所牽涉到某些公司的安全性,則Windows 2000可以產(chǎn)生GUID,將MAC位址再做個(gè)包裝,而非全封不動(dòng)地出現(xiàn)在GUID。</span><span id=Layer60></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b>附注 </b></font><p><font size=2 color=#3c3c3c face=arial>為何能讓在不同臺(tái)機(jī)器上獨(dú)立執(zhí)行的相同軟體,確能夠確保軟體產(chǎn)生的值都不相同呢?答案就在GUID所包含的東西。它的主要組成份子包含一個(gè)時(shí)間戳記(timestamp)指明建立的時(shí)間,以及安裝在GUID產(chǎn)生的這臺(tái)電腦之網(wǎng)路卡的Medium Access Control (MAC)位址。 時(shí)間戳記能確保在這臺(tái)機(jī)器上產(chǎn)生的每個(gè)GUID都是不同的,而MAC位址確保兩個(gè)同時(shí)產(chǎn)生的GUID不會(huì)相同,因?yàn)镸AC位址是由一個(gè)集中的機(jī)構(gòu)制定,每塊網(wǎng)卡的MAC位址在這個(gè)世界上都是唯一的。這使得GUID的產(chǎn)生相當(dāng)容易,但仍可以確保唯一性。若要論及所牽涉到某些公司的安全性,則Windows 2000可以產(chǎn)生GUID,將MAC位址再做個(gè)包裝,而非全封不動(dòng)地出現(xiàn)在GUID。</span><span id=Layer61></font></p><hr><p><font size=2 color=#3c3c3c face=arial><font size=2 face=arial color=#3e80d7><b> 定義介面</span><span id=Layer62> </b></font>一個(gè)COM介面是一個(gè)相當(dāng)簡(jiǎn)單的概念,它只定義了客戶端需要知道以便呼叫method的東西。因?yàn)镃OM使用許多方式來定義COM介面,所以你有許多種選擇。定義介面最正式也最強(qiáng)大的方式便是使用COM的介面定義語(yǔ)言(Interface Definition Language,IDL)。IDL的語(yǔ)法是由C衍生的,而COM的IDL事實(shí)上是基於Open Group的Distributed Computing Environment (DCE)定義的IDL。</span><span id=Layer63></font></p><p><font size=2 color=#3c3c3c face=arial>IDL可以用來定義介面</span><span id=Layer64></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>IDL可以用來定義介面</span><span id=Layer65></font></p><hr><p><font size=2 color=#3c3c3c face=arial>若前述的訂單項(xiàng)目的介面是一個(gè)vtable介面,它的IDL看起來可能如下:</span><span id=Layer66></font></p><div style="background-color: #D7D7D7;"><font face=Arial size=3><pre>[ object,, uuid(A7CD0D00-1827-11CF-9946-493655354000)]
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -