回覆列表
  • 1 # 使用者9269141912714

      COM規範規定任何元件、任何介面都必須從IUnknown繼承,IUnknown包含三個函式,分別是 QueryInterface、AddRef、Release。這三個函式是無比重要的,而且它們的排列順序也是不可改變的。QueryInterface用於查詢元件實現的其它介面,說白了也就是看看這個元件的父類中還有哪些介面類,AddRef用於增加引用計數,Release用於減少引用計數。引用計數也是COM中的一個非常重要的概念。大體上簡單的說來可以這麼理解,COM元件是個DLL,當客戶程式要用它時就要把它裝到記憶體裡。另一方面,一個元件也不是隻給你一個人用的,可能會有很多個程式同時都要用到它。但實際上DLL只裝載了一次,即記憶體中只有一個COM元件,那COM元件由誰來釋放?由客戶程式嗎?不可能,因為如果你釋放了元件,那別人怎麼用,所以只能由COM元件自己來負責。所以出現了引用計數的概念,COM維持一個計數,記錄當前有多少人在用它,每多一次呼叫計數就加一,少一個客戶用它就減一,當最後一個客戶釋放它的時侯,COM知道已經沒有人用它了,它的使用已經結束了,那它就把它自己給釋放了。引用計數是COM程式設計裡非常容易出錯的一個地方,但所幸VC的各種各樣的類庫裡已經基本上把AddRef的呼叫給隱含了,在我的印象裡,我程式設計的時侯還從來沒有呼叫過AddRef,我們只需在適當的時侯呼叫Release。至少有兩個時侯要記住呼叫Release,第一個是呼叫了 QueryInterface以後,第二個是呼叫了任何得到一個介面的指標的函式以後,記住多查MSDN 以確定某個函式內部是否呼叫了AddRef,如果是的話那呼叫Release的責任就要歸你了。 IUnknown的這三個函式的實現非常規範但也非常煩瑣,容易出錯,所幸的事我們可能永遠也不需要自己來實現它們。

  • 中秋節和大豐收的關聯?
  • 用C語言編寫一個程式?