logo资料库

Inside COM 中文版.pdf

第1页 / 共299页
第2页 / 共299页
第3页 / 共299页
第4页 / 共299页
第5页 / 共299页
第6页 / 共299页
第7页 / 共299页
第8页 / 共299页
资料共299页,剩余部分请下载后查看
完全剖析COM
書本簡介
Index
譯者序
校閱者序
致謝
簡介
1 元件(Component)
元件的優點
應用程式功能的自訂性
元件庫(component libraries)
分散式元件
使用元件的先決條件
動態連結
封裝(encapsulation)
與語言無關
版本(Version)問題
COM
COM元件是...
COM不是...
COM程式庫
COM的風格
COM物超所值
COM世界簡史
元件結論
2 介面(Interface)
處處聞介面
程式架構的可重複使用性
COM介面其他好處
實作COM介面
完整的範例
IFACE.CPP
__stdcall或Pascal叫用協定
非介面式溝通
實作細節
類別不等於元件
不一定要使用繼承關係來實作介面
多重介面跟多重繼承
名稱重複
介面的理論(續篇)
永遠不能變的介面
多形(Polymorphism)
介面背後的秘密
虛擬函式表格
vtbl指標跟物件資料(instance data)
多個相同類別的物件同時存在的狀況
不同類別,相同vtbl結構
總結:建構程式的積木
3 QueryInterface
詢問所需要的介面
IUnknown介紹
取得IUnknown指標
QueryInterface函式初步
QueryInterface的使用
QueryInterface原則與定律
用戶端程式每一次取得的都是相同的那一個IUnknown介面
用戶端程式可以取得任何曾經取得過的介面
用戶端程式可以取得已經擁有的介面
用戶端程式可以回到起點介面
如果用戶端程式可以從某個介面取得特定介面, 那麼就可以從任何一個介面取得該介面
QueryInterface定義了整個元件
新版本元件的管理
共識契約(Implicit Contract)
您是有腳的動物嗎?..開玩笑的!
4 參用計數(Reference Counting)
生命期的控制
參用計數概述
參用計數法的使用介面
除錯
需要時才配置(on-demand)的資源
實作AddRef以及Release函式
使用參用計數的時機
參用計數最佳化
參用計數原則
Out參數原則
In參數原則
In-Out參數原則
區域變數原則
全域變數原則
百戰百勝原則
消防隊員的外套,本章總結
5 動態連結
元件的誕生
輸出DLL中的函式
列印輸出資訊
CMPNT1.DEF
載入DLL
CREATE.CPP
為何可以使用DLL
切割單一程式
程式列表
CLIENT1.CPP
CMPNT1.CPP
IFACE.H
GUIDS.CPP
元件運動大會
本章總結:缺乏彈性的元件產生方式
6 HRESULT、GUID、登錄資料庫以及其他細節
HRESULT
查詢HRESULT值
HRESULT的使用
多重狀態碼
錯誤可以變更
HRESULT與網路的關係
自行定義的傳回碼
GUID
為什麼使用GUID?
GUID的故事
GUID的宣告與定義
GUID的比較運算
使用GUID來識別元件
傳址方式(Reference)傳遞GUID
Windows系統的登錄資料庫(Registry)
登錄資料庫的組織結構
登錄編輯程式
基礎知識
其他登錄資料庫中的資訊
ProgID
ProgID命名慣例
ProgID的登錄格式
自動登錄
DllRegisterServer的實作方法
Component Category(元件分類)
元件分類的實作
COM程式庫函式概觀
COM程式庫的初始化
OleInitialize的使用
CoInitializeEx
記憶體的管理
將字串轉換為GUID
總結
介面定義巨集註解篇
7 類別工廠(Class Factory)
CoCreateInstance函式
CoCreateInstance的宣告
CoCreateInstance的使用
類別執行環境(class context)
用戶端程式列表
CLIENT.CPP
缺乏彈性的CoCreateInstance
類別工廠(class factory)
CoGetClassObject的使用
IClassFactory
CreateInstance
IClassFactory2
CoCreateInstance對決CoGetClassObject
CoGetClassObject的使用時機
類別工廠的封裝功能
實作類別工廠
叫用DllGetClassObject函式
鳥瞰全局
程式列表
CMPNT.CPP
流程的控制
元件的登錄
DllMain函式
包含多個元件的DLL
實作可重複使用的類別工廠
DLL的釋放(Unload)
DllCanUnloadNow的使用
LockServer
總結
8 元件的重複利用:包含與聚合
包含與聚合
包含關係概論
聚合關係概論
包含關係的實作
延伸介面的功能
聚合關係的實作
C++ 與聚合的關係
QueryInterface變魔術
不正確的IUnknown介面
聚合下的Unknown介面
Outer Unknown
delegating unknown以及nondelegating unknown
Nondelegating Unknown的實作
Delegating Unknown的實作
內部元件的產生
外部元件的Init函式
內部元件的IClassFactory::CreateInstance函式
內部元件的建構函式
外部元件中指向內部元件介面的指標
完整的範例
AGGRGATE\CMPNT1
AGGRGATE\CMPNT2
盲目式的聚合
Metainterface
配對(Matched Pair)法
真實世界裡的聚合與包含
提供內部狀態資訊
模擬虛擬函式(virtual function)
總結
9 讓自己更輕鬆
用戶端程式的簡化
編譯器對於COM的支援
智慧型介面指標(Smart Interface Pointers)
智慧型介面指標的實作
PTR.H中的IPtr樣板
介面指標類別的使用
參用計數的更改
設定運算子
Unknown介面的設定
interface_cast
IUnknownPointer指標類別
使用智慧型指標實作用戶端程式
CLIENT2.CPP
智慧型指標的潛在問題
C++包裝(Wrapper)類別
包裝類別與元件包含的相似性
包裝多個界面
伺服器端的簡化方法
10 實作在EXE中的伺服器
11 Dispatch介面與自動化(Automation)機制
12 多執行緒(Thread)
13 綜合大演練
參考書籍
書本簡介 書本簡介 書        名:完全剖析COM 出版日期:2000/3/15 書        號:957-0312-29-7  I  S  B  N:957-0312-29-7 原  作  者:Dale Rogerson 譯        者:黃昕暐 書本簡介 章節目錄 譯者序 -從絢爛回歸樸實 校閱者序 致謝 簡介    . 必備條件    . C++    . 書中的範例    . 支援 1. 元件(Component)     . 元件的優點    . 使用元件的先決條件    . COM    . 元件結論 2. 介面(Interface)     . 處處聞介面    . 實作COM介面    . 介面的理論(續篇)    . 介面背後的秘密    . 總結:建構程式的積木 3. QueryInterface     . 詢問所需要的介面 file:///C|/Users/cash_chang/Dropbox/Data/work/Win Programming/ebook/完全剖析COM/html/Index.htm[2012/7/25 下午 06:37:44]
書本簡介    . QueryInterface原則與定律    . 如果用戶端程式可以從某個介面取得特定介面,那麼就可以從任何一個介面取得該介面    . QueryInterface定義了整個元件    . 新版本元件的管理    . 共識契約(Implicit Contract)    . 您是有腳的動物嗎?..開玩笑的! 4. 參用計數(Reference Counting)     . 生命期的控制    . 參用計數概述    . 使用參用計數的時機    . 消防隊員的外套,本章總結 5. 動態連結     . 元件的誕生    . 切割單一程式    . 元件運動大會    . 本章總結:缺乏彈性的元件產生方式 6. HRESULT、GUID、登錄資料庫以及其他細節     . HRESULT    . GUID    . Windows系統的登錄資料庫(Registry)    . COM程式庫函式概觀 7. 類別工廠(Class Factory)     . CoCreateInstance函式    . 類別工廠(class factory)    . 實作類別工廠    . 包含多個元件的DLL    . DLL的釋放(Unload)    . 總結 8. 元件的重複利用:包含與聚合     . 包含與聚合    . 聚合關係的實作    . 完整的範例    . 真實世界裡的聚合與包含 file:///C|/Users/cash_chang/Dropbox/Data/work/Win Programming/ebook/完全剖析COM/html/Index.htm[2012/7/25 下午 06:37:44]
書本簡介    . 總結 9. 讓自己更輕鬆     . 用戶端程式的簡化    . 伺服器端的簡化方法 10. 實作在EXE中的伺服器     . 不同的行程    . IDL/MIDL簡介    . 本地端伺服器的實作    . LockServer函式的修改    . 來趟遠足吧-遠端伺服器    . DCOMCNFG.EXE動了什麼手腳?    . 摘要 11. Dispatch介面與自動化(Automation)機制     . 新的溝通方式    . 使用IDispatch介面    . BSTR資料型別    . 型別庫(Type Library)    . 實作IDispatch介面    . 今天想做什麼? 12. 多執行緒(Thread)     . COM的執行緒模式    . 寓所執行緒模式實作解析    . 寓所式執行緒範例步步追蹤    . 自由執行緒模式範例演練    . 與執行緒有關的登錄資料庫機碼    . 本章總結 13. 綜合大演練     . 七巧板(Tangram)程式    . 用戶端程式    . 技巧大展    . IDL檔    . 循環式參用計數    . 事件跟連接點(Connection Point) file:///C|/Users/cash_chang/Dropbox/Data/work/Win Programming/ebook/完全剖析COM/html/Index.htm[2012/7/25 下午 06:37:44]
書本簡介    . COM的一切就是標準的介面    . 呼!苦難終於過了 參考書籍 file:///C|/Users/cash_chang/Dropbox/Data/work/Win Programming/ebook/完全剖析COM/html/Index.htm[2012/7/25 下午 06:37:44]
譯者序 譯者序 -從絢爛回歸樸實 相信許多人都和我一樣,家裡的書櫃上擺了一本Inside OLE哲學書!稱這本書為哲學書,一點也不為過,我自己苦心專研,總還是 不免捶手頓足,最後也不過看到第四章沒完!而這第四章又是什麼呢?就是這一本書的主題:Component Object Model。 我想,學習OLE(喔,對不起,我總是趕不上時代,雖然大家都已經稱呼它為ActiveX,但我還是比較喜歡OLE,也許比較念舊吧) 沒有捷徑,當然,要苦K Inside OLE我並不反對,但您需要絕對的勇氣與無比的毅力!如果受不了誘惑,想要21天學會OLE,打死 我都不相信!甚至來個重金屬學習OLE,由於包了美氟寶(我是說MFC啦)在外面,很難看的清楚裡面的一舉一動。我認為,要學 習OLE,一定得要回到最根本,也就是從最基本的COM學起。有了深厚的內功打底,再去與龐大的OLE搏鬥,勝算就高些了。 因此,我一直在等待有一本好的書,可以在COM上多所著墨,盼呀盼的終於,在Inside系列裡等出了一本Inside COM!幾百頁的內 容,完完全全在講COM,誠如原作者在最後一章所說,看完這本書,您就已經是位COM專家了!事實上,我也常常跟別人說,大概 五年內都不會有人肯下這樣的苦心寫一本類似的書,因此,錯過了這本,您只好再回頭去苦K哲學類的Inside COM了。 也正因為以上的原因,我自己一直覺得這本書絕對不能做爛,否則就白白糟蹋了一本好書!為此,我自己另外又再找了一位在業界 服務多年的徐銘志先生,幫我做技術校稿的工作。其實這也是我一直所希望能夠採用的書籍撰寫模式,不論是翻譯或是著作,都應 該要有除了作者以外的編輯人員完全看過,以便能夠將書籍中錯誤的觀念以及不適當的用詞挑出來,好好的再加以修整才對。因 此,這本譯本的完成,徐先生佔了極大的功勞,不能免俗地要在這裡大聲地謝謝他! 最後,對於已經將這本書拿在手上要開始閱讀的讀者,有幾個建議請各位讀者參考。首先,雖然這本書和許多書一樣,都說讀者並 不需要很深厚的C++ 功力,不過我總是認為這樣的話勉勵的成份居多,我建議大家看這本書的時候,可以同時備妥像是The C++ Programming Language、ARM、或者是Thinking in C++ 這類的書(抱歉,我不能把所有C++ 的好書通通列出來,您可以挑您最喜 愛的,但深度一定要夠),以便能夠搞的清楚書中會使用到的C++ 觀念!另外,由於原作者並不會針對範例程式一行一行跟您解 說,因此,我強烈建議您把光碟上所附的原始程式跟著書本一行一行檢視,以便能夠將書裡對於範例的片段解釋連貫起來。我想, 原作者寫了本好書,身為讀者的我們下點苦工,也是應該的,對吧! 好了,不打攪各位,先預祝各位能夠練成這套入門心法,撬開ActiveX大門! 黃昕暐 mee@indexmare.com http://mee.indexmare.com file:///C|/Users/cash_chang/Dropbox/Data/work/Win Programming/ebook/完全剖析COM/html/Translate.htm[2012/7/25 下午 06:37:57]
校閱者序 校閱者序 首先,你會懷疑學習COM的必要性。目前已經有一些發展工具,讓你可以輕輕鬆鬆地製作和使用元件,犯不著硬著頭皮往COM猛 鑽,不是嗎?是的,基於商業考量,老闆們也不希望你從無到有發展一個元件。但是身為一個元件的發展或使用者,如果不了解這 些元件的內部到底做了些甚麼事,您能放心嗎?就好比學習MFC而沒有深固的SDK基礎,無疑是在沙洲上築高塔,怎能不令人擔 憂!再者,當這些高階的發展工具無法達成你的需求時,又該如何是好?別以為這種情況不會發生,至少到目前為止,元件的多執 行緒問題,還是得靠程式師對COM的深入了解才能解決。 接觸OLE二年有餘,也利用OLE的技術開發了一些產品。回憶起學習OLE的過程,最遺憾的莫過於缺乏一本真正從根本談起的好 書,當時手邊只有一些參考手冊和一本完整但難以消化的Inside OLE 2(現已改版為Inside OLE)。值得慶幸的是,現在,這一 本Inside COM正是從最根本的COM談起,暫時讓你免去面對那些OLE加在COM身上的分枝旁節。另外一個重點是,範例程式寫得 妙,仔細品味每一章的範例程式,作者的用心處處可見。 黃昕暐是一個擁有特「譯」功能的傢伙,對於他的譯筆,無從挑剔。技術編輯?別誤會,我的文字功夫絕對無法與他相提並論,那 麼身為技術編輯應該做些甚麼呢?難道不是挑錯字、修飾文句或寫幾句「編按:……」嗎?其實技術編輯的首要任務是維護書本內 容在於技術方面的正確性,而不只是做一些「文字編輯」的工作。這話說得有些嚴重,希望不會得罪太多人。 學習OLE是一條荊棘密佈的長路,身處這條路上,你看不到前面的路還有多遠,也不能去想已經走過的路有多長,唯一能做的是站 穩每一個腳步、面對每一個困難,希望這本書可以幫助你走得更快、更穩。   徐銘志 謹識 textar@ms13.hinet.net file:///C|/Users/cash_chang/Dropbox/Data/work/Win Programming/ebook/完全剖析COM/html/Front.htm[2012/7/25 下午 06:38:04]
致謝 致謝 當我還在喬治亞理工學院的時候,我的研究生室友常常拿他們撰寫學術文章所得到的功勞(或者說得不到甚麼功勞)開玩笑。這些 文章的呈現方式通常都會在封面列上三個名字,其中第一個是指導教授的名字,然後是另外一位與完成這篇文章完全無關、但卻不 得不列出來的教授的名字,最後才是完成所有工作的學生名字,而且這名字看起來還像是事後想起來再補上去的一樣。這本書的狀 況就截然不同了,封面只有一個人的名字,就是我,然而背後卻因為一大群人的努力,才得以讓這本書完成!這些人的名字其實都 該放在封面才對。 首先,如果不是Nigel Thompson,我根本不會開始寫這本書。他在開發人員的圈子中發現了一本專門講COM的書籍的需求,並且鼓 勵我來撰寫這樣的書。而Nancy Cluts總是在我腸枯思竭的艱苦時候帶給我一些鼓舞人心的話語。當我寫出來的文字不是頂好的時 候,Nigel以及Nancy總是以最開誠的心胸給我建議,讓我能夠把這本書寫的更好些。 Kraig Brockschmidt以及Craig Wittenberg在這本書逐漸成形的階段,給了我不少指引方針,除此之外,他們兩位也在技術上給我不 少必要的鼓勵與意見。 雖然寫文章本身是件個人的工作,不過要變本書出來可就得依賴一組優秀的團隊,而我就這麼幸運的遇上了一組夢幻隊 伍!Microsoft Press的一些人一開始並不認為值得去出版一本專門講COM的書,但Eric Stroo說服了他們。Kathleen Atkins則在專 案編輯的角色上扮演得相當出色,她不但管理了整個專案的進行,也把我的文字提昇到散文的境界,如果這還不夠讓您驚訝的話, 我還得告訴您用在每一章開頭的照片也都是她拍的。Pam Hidaka幫這本書做了相當酷的設計,而Michael Victor在圖形效果上也有相 當棒的貢獻,包括了伴隨著照片出現的七巧板圖案也都是他的傑作。Gary Nelson這位技術編輯真是沒話說,盡職的檢驗書中每一個 技術上的細節,不論是多麼平凡或是奇特的地方,他都不放過。Shawn Peck對於最後的定稿貢獻良多,同時也對Kathleen以 及Gary沒有發現到的錯誤補上最後的修正。 除此之外,我也要謝謝所有閱讀以及審視這本書初稿的朋友:Mary Kirkland、Mark Kramer、John Thorson、Tim Bragg、Vinoo Cherian、Charley Kindel、Jerry Noll、以及Kirk Goddard。 我還要謝謝Microsoft Developer Studio團隊的同事,他們允許我在週末趕回家寫這本書,特別要謝謝Martyn Lovell花時間和我討論 技術上的許多課題。 另外,如果不是我在Microsoft Developer Network所學到的寶貴經驗,我也不會有機會撰寫這本書。在MSDN我瞭解到一位好編輯 的重要性,而幸運的我也遇到了一位,他就是Handan Selamoglu,他也把我訓練成一位優秀的編輯。 最後,我得謝謝我的朋友與家人,他們在我的人生中佔著相當重要的地位。首先得向Peter Lancaster與Paul Schuster說聲抱歉,因 為這本書的忙碌所以今年沒去泛舟,明年再來!另外,也要謝謝我的姊姊,她總是在身邊支持我。我也要謝謝我的父母,當年的第 一部Radio Shack TRS-80電腦就是他們買的。Sarah,謝謝你,這一年你好像失去了男友一樣! file:///C|/Users/cash_chang/Dropbox/Data/work/Win Programming/ebook/完全剖析COM/html/Thanks.htm[2012/7/25 下午 06:38:09]
簡介 簡介 您是否希望能夠在軟體上市之後還可以持續修改、甚至於加上新的功能呢?您是不是期望能夠以慢慢一點一點加入新功能的方式來 發展軟體、而不必為了改版每兩年就得重新撰寫一次呢?您是不是也希望所製作的軟體可以讓使用者輕易地自訂功能、或者讓您的 軟體更具彈性、更容易動態變換功能呢?您是否想要加快應用程式的發展時程呢?您是不是奢望您的應用程式可以輕易地在分散式 的環境上正常執行呢? 您對使用元件來開發程式有興趣嗎?您希望將整個程式切割成多個元件嗎?您想學習COM嗎?您想學習(OLE)自動化機制 (Automation)嗎?您想突破學習OLE時的難關嗎?您認為COM或是OLE很難嗎?您想瞭解軟體巨人微軟一些新技術,像 是ActiveX、DirectX、以及OLE等等的基礎理論嗎?您想要自訂或是延伸微軟應用程式或是作業系統的功能嗎? 如果對於以上任何一個問題您的答案是「是」的話,那麼這本書您就選對了!所有這些問題通通都卡在一個關鍵,也就是微軟的元 件式物件模式(Component Object Model),通常大家都稱之為COM。而這本書就要告訴您如何利用C++ 語言來發展您自己 的COM元件。 COM是一種發展軟體元件的方法,所謂的軟體元件,就是指一個可以提供應用程式、作業系統、以及其他元件特定服務的二進位可 執行程式。事實上,發展自訂的COM元件就好像是在建構一套動態的物件導向API一樣!您可以在程式的執行時期隨意拼上或是移 除所需要的元件,完全不需要重新編譯或是連結整個程式,就可以立即運作。這樣的技術也正是微軟之所以能夠發 展ActiveX、DirectX、以及OLE等等技術的基石,微軟的發展人員也運用了COM技術來自訂應用程式以及作業系統的功能。 必備條件 這本書主要的對像是中等程度的C++ 程式師,而且必須有一些Win32程式設計的經驗。不過如果您是C++ 的初學者,倒也無妨,因 為利用C++ 來製作COM元件並不需要多高深的C++ 技巧。在利用C++ 製作COM元件時,所需要的觀念裡面最難的恐怕就是多重繼 承了,而就算是這樣,在書中也都會針對相關細節做詳細的解說。事實上,反過來講,初學C++ 的人透過這本書學習COM程式設計 還有個好處,就是可以養成良好的程式設計習慣呢!不過話說回來,如果您能夠看看其他C++ 的入門書,也會有相當大的幫助。 如果您對於Windows程式設計有豐富經驗,那也不錯,只不過這並不是閱讀本書的必要條件!我也盡量避免用到一些跟Windows系 統相關的程式碼,所以即使您是UNIX用戶,應該也可以很順利地理解書中的程式。當然啦,Windows程式師在一些製作Windows應 用程式相關的工具上會比較熟悉,這是唯一比非Windows程式師佔優勢的地方。 至於Microsoft Foundation Class這套程式庫(MFC)也一樣不需要,以製作COM元件來說,使用MFC並沒有什麼好處,因此除了 最後一章以外,所有的範例都完全不會用到MFC,請大家放心。 歡迎非Windows程式師進入COM的世界 如果您是在UNIX、麥金塔、Linux、VMS、或是其他作業系統上的軟體發展人員,那麼閱讀這一本書也一樣可以得到許多啟發。事 實上,從COM所散發的概念並不是只能用在Windows系統上,因為COM並不是一組龐大的API,而是像結構化程式設計或是物件導 向程式設計一樣,是一種程式設計的方法,您可以在各種作業系統上運用這種「COM的風格」!當然啦,在Windows上要運用這種 file:///C|/Users/cash_chang/Dropbox/Data/work/Win Programming/ebook/完全剖析COM/html/Brief.htm[2012/7/25 下午 06:38:14]
分享到:
收藏