四刷 0500本(2001/09)  
三刷 0500本(2000/10)  
二刷 0600本(1999/04)  
一刷 2000本(1999/03)  

《COM 本質論》
Essential COM

侯捷 譯

box.jpg (15903 bytes)

繁體版 勘誤

書內程式源碼下載

答客問


【基本資料】

書名:COM 本質論
出版:眳p 1999.02
ISBN:957-566-3187-7
頁數: 7 章,440 頁
定價:NT$ 780.0

原著:Essential COM
原著作者:Don Box
原著出版:Addison Wesley, 1998
原著ISBN:0-201-63446-5
原著定價:US$ 34.95

【譯序】

關於本書定位,我沒有辦法一言以敝之。

量子力學大師波耳(Niels Bohr1922 諾貝爾物理獎得主)曾說:『思考量子理論而不頭昏眼花的人,根本不懂量子理論』。

我稍帶誇張地借用這句話:『學習 COM 而不頭昏眼花的人,根本未曾進入 COM』。

然而,量子理論之所以令人頭昏眼花,是因為它與牛頓力學不符,與我們認知的常識不符。COM 之所以令人頭昏眼花,卻是因為想要認識它的人,根基通常都不夠。

基本上,學習 COM,你需要具備不少基礎知識:

是的,如果我們有了必要的 C++ Object Model 知識(我指的是虛擬函式的內部機制、自然多型與非自然多型、static_castdynamic_cast 的意義),並且在學習 COM 之前先明白 COM 究竟要解決軟體界的什麼問題,我們就可以逐步擺脫頭昏眼花的狀態,進入萬物靜觀皆自得的層次,然後就可以逐步將視野擴展到分散式電算環境中的各個主題。

換言之,雖然或許人人都耳聞 COM 大名,但它並不是一個程式新手應該追尋的目標。你必須對物件導向程式開發工具(C++ 語言尤佳)、作業系統概念、分散式處理原則都有一些基礎,才具備進入這個領域(並深刻瞭解它)的本錢。所以,以下我所謂的新手,非指程式開發的全然新手,而是指具備了上述基礎的 COM 新手。

做為本書譯者,我在這裡介紹其他 COM 書籍,有點奇怪。但以資訊教育者的身份,以及書評人身份,為讀者鋪陳理想的 COM 學習之路,實乃份所當為。我認為,COM 相關書籍大約可分四類:

以目前國內軟體工程界對 COM 的認識程度,我們最需要的恐怕是第一類。Inside COM 是一本很容易上手的書,我很推薦。但如果想要知道COM 來龍去脈,還得參酌 Essential COM 第一章。

適才我說過,沒有辦法簡單一句話就說明 Essential COM 的適合對象,原因便是雖然本書前兩章極適合牽引你進入 COM 領域,但其他章節卻又把COM 挖得很深,深到即令具備 COM 經驗的老手讀來亦覺吃力。

自從網路上公佈我將翻譯Essential COM 之後,中譯本 COM 本質論 便受到眾多讀者的期待,我也收到為數極多的 email 詢問信函。但是我想,不是每一位期待它的人都有馬上享用它的能力,這一點必須提醒你。當然,以「好書千萬不要錯過」的心情立刻讓它進駐你的書架,是我的大安慰。

如果你閱讀本書第一章仍覺吃力,那麼你需要先補強 C++ Object Model 的知識。以下是我推薦的兩本書:

有趣的是,COM / OLE 領域中重要的兩本著作的作者,都提到了一種奇異的頓悟經驗。

Inside OLE 作者 Kraig Brockschmidt 說:

我隱約感覺 OLE 遠比我原先認知的不同,卻又很難打斷 OLE 與複合文件之間的等號,因為每一份技術報告都把兩者視為同義。我逐漸瞭解,OLE 事實上已經建立了一個非常巨大的系統,一個在 Windows 之下的物件導向程式設計系統。1993 年一月的某個週日下午,我突然獲得了所謂的 OLE 涅槃狀態。所有關於 OLE 的支支節節突然全都歸定位。歷經六個月的模糊心智之後,我突然看清楚了 OLE

Essential COM 作者 Don Box 說:

我一直未能對「COM 程式模型為什麼設計成這個樣子」有結構上的瞭解。幸運的是有一天(1994 88日),突然像神蹟一般,COM 對我變得再明白不過,我終於瞭解了 COM 的設計動機。如何把這個程式模型應用在每天遇到的問題中,也因此顯得再明白不過。

兩位先生的話,令人覺得學習COM / OLE 之前要先有宗教信仰,以求進入涅槃或獲得神蹟。其實沒有漸悟是不可能成就頓悟的,大師開悟之後的種種心法都已詳實記錄在他們的「嘉言錄」當中,就看我們自己的用心了。

祝各位早日進入涅槃,獲得神蹟。

侯俊傑 1999.01.15 于新竹

 

【目錄】

/ 001

侯俊傑 譯序 / 007

Charlie Kindel / 011

Grady Booch / 017

/ 019

第一章 COM 是一個更好的 C++ / 001

分散式軟體與 C++Software Distribution and C++/ 003

動態聯結與 C++Dynamic Linking and C++/ 005

C++ 與可移植性(C++ and Portability/ 006

封裝性與 C++Encapsulation and C++/ 008

從實作(implementation)中分離出介面(interface/ 011

以抽象基礎類別做為二進位介面 / 014

執行時期的多型性質(Runtime Polymorphism/ 023

物件的延展性(Object Extensibility/ 025

資源管理(Resource Management/ 033

我們身置何處? / 037

第二章 Interfaces / 039

重訪 Interfaces Implementations / 039

IDLInterface Definition Language/ 041

成員函式(Methods)與執行結果 / 044

Interfaces IDL / 047

IUnknown / 051

資源管理與IUnknown / 057

型別強制與IUnknown / 061

實作IUnknown / 066

使用 COM Interface 指標 / 071

QueryInterface 最佳化 / 074

資料型別(Data Types/ 079

Attributes Properties / 093

異常情況(Exceptions/ 094

我們身置何處? / 100

第三章 Classes / 101

重訪 Interfaces Implementation / 101

Class Objects / 104

活化(Activation/ 107

使用SCMService Control Manager/ 110

類別與伺服器(Classes and Servers/ 114

一般化(Generalizations/ 123

最佳化(Optimizations/ 126

再一次談 InterfacesImplementation / 133

MonikersComposition(組合) / 139

Monikers Persistence(永續生存) / 142

伺服器的生命期(Server Lifetime/ 146

Classes IDL / 149

Class Emulation(類別凌駕) / 153

Component Categories(元件種類,元件部門) / 155

我們身置何處? / 161

第四章 Objects / 163

重訪IUnknown / 164

QueryInterface 是對稱的(Symmetric/ 166

QueryInterface 是遞移的(Transitive/ 167

QueryInterface 是反身的(Reflexive/ 169

物件擁有靜態型別(Static Type/ 171

Uniqueness(唯一性)與Identity(身份證明) / 173

QueryInterface IUnknown / 173

多重介面和 Method 名稱 / 176

動態的(DynamicComposition / 187

二進位的(BinaryComposition / 194

Containment / 206

我們身置何處? / 207

第五章 Apartments / 209

再一次談 Interfaces Implementation / 210

Objects, Interfaces Apartments / 214

跨越 Apartment 的存取動作 / 218

In-Process Marshaling 輔助函式 / 226

標準的 Marshaling 架構 / 231

實作出Interface Marshalers / 237

Standard Marshaling, Threads, Protocols / 241

生命週期(lifecycle)的管理與 Marshaling / 249

Custom(自定的)Marshaling / 257

Free Threaded Marshaler / 263

我們身置何處? / 273

第六章 Applications / 275

In-Process Activation(行程內活化)的缺點 / 275

活化行為(Activation)與 SCM / 277

再談伺服器的一生 / 282

Applications IDs / 289

COM Security(安全防護) / 294

可規劃的安全防護(Programmatic Security/ 303

存取控制(Access Control/ 314

Token(許可證)的管理 / 321

我們身置何處? / 328

第七章 雜項探討 / 329

指標基礎觀念 / 330

指標與記憶體 / 333

陣列(Arrays/ 342

流程控制 / 361

動態喚起 v.s. 靜態喚起 / 365

雙向介面契約(Bidirectional Interface Contracts/ 371

IDL中的Aliasing / 384

非同步(AsynchronousMethods / 389

我們身置何處? / 390

附錄A 物件的演化 / 391

附錄B 部份程式碼 / 399

 

【讀者反應】


作者 "david" <davidko@iii.org.tw>, 看板 CompBook
標題 好消息, COM本質論已經出版了
時間 III InterNetNews News System (Sat Mar 13 10:52:07 1999)
──────────────────────────────
我已經買回一本在研讀了,侯老師的書真是有魅力,
不但文筆好,翻譯也是很有品質, 雖然我已有原文書,
但是忍不住還是再買一本中譯本. 在此先謝謝侯老師的用
心, 這真是台灣讀者的福氣啦!!


送件者: Yu-Ming Kao <ymkao@iobject.com.tw>
主旨: 關於 COM 本質論 的一些錯誤
日期: 1999年3月15日 PM 07:10

> 侯先生您好: 首先, 很感謝您這些年來在臺灣資訊界的努力. 也許有人喜
> 歡您,有人討厭您; 但我認為藉由您的努力, 真的發揮了正面的影響力.
> 我是英文版 Essential COM 的讀者, 在您的譯本 - "COM 本質論"出版後
> 也買了一本, 做為參考之用.
> 雖然目前還沒有時間仔細拜讀您的譯作, 拿到書後還是忍不住先翻了
> 翻,而發現了一些錯誤. Don Box 在原書出版後, 於 97 年底即開始在其
> web 上放了一個勘誤表, 註明原書在前幾刷中的一些錯誤. 我猜想您是
> 根據此書的第一刷來翻譯, 而勘誤表上註明的錯誤有些您已發現更正,
> 有些仍出現在您的譯著之中. 當然, 這些都是原著的錯誤
> 但是我想這些錯誤在您的譯本應該是可以避免的. 底下舉了幾個例子,
> 您可自 http://www.develop.com/essentialcom/errata.asp 找到完整的勘誤,
> 做為您下一刷改正的參考
> 高聿明 Software Engineer 緯鵬國際科技

侯俊傑  回覆

非常感謝 Yu-Ming。我的確是以 <Essential COM> 第一刷來翻譯。沒有將網上的 errata 修正到中譯本上,是我的疏忽。

對於只有中譯本而無原文本的讀者,此 errata 幫助不大,因為都列的
是原文本頁碼。我打算將 <COM 本質論> 的原文 errata 加上中譯本頁碼,放進我的網站中。


Essential COMJJ Hous edition

(6/4) After two weeks of waiting, I finally received the book. A few first impressions:

  1. Cover of the book: kept it in sync. with the original. Good! A translated book should have the same look and feel of the original. I hate people change the cover.
  2. JJ Hours autobiography matches the style of Don boxes. He did by purpose, right?
  3. The translators note is the biggest value-added thing. Especially, the notes on class object (p.104). I would not run into the trouble if I read this. (Well, I read the English version before I got Hous.)
  4. I like the highlighted program Hou added.
  5. FYI. http://www.develop.com/essentialcom/errata.asp has errata of the original.

I have one major complaint: I need Index! Its a convenient tool when I want to look up some key term, e.g. VARIANT. I recall Hou sir told me he ran into some technical difficultly on producing this. I forgot what was that. Since theres no single book, which presents COM/ALT in a logical order (based on my standard), I usually cross-reference a couple of books at same time. Good indexes help me a lot.