介面支持的意義
除了 IUnknown 介面之外,ActiveX Control 或 COM 物件也表示它透過其他介面支援的任何選擇性功能。 也就是說,IUnknown 上方不需要其他介面。 為此,下表列出 ActiveX Control 可能支援的介面,以及支援該介面的意義。
介面 | 批注/支援介面的意義 |
---|---|
IOleObject |
如果控件需要與其用戶端月台通訊的事件以外的任何專案(請參閱 I 連線 ionPointContainer),則 IOleObject 是必要的。 實作這個介面時,控件也必須支援下列方法的語意:SetHostNames、Close、EnumVerbs、Update、IsUpToDate、GetUserClassID、GetUserType、GetMiscStatus 和建議、Unadvise 和 EnumAdvise 方法可與容器的 IAdviseSink 實作搭配運作。 如果容器提供 IAdviseSink,實作 IOleObject 的控件必須能夠處理 IAdviseSink;在此情況下,控件可能無法確保它不會嘗試呼叫不存在的接收。 |
IOleInPlaceObject |
表示控制項可就地啟用且可能啟用UI的能力。 這個介面表示控件具有某種可啟動的使用者介面,而且也支援 IOleInPlaceActiveObject。 必要的方法是 GetWindow、InPlaceDeactivate、UIDeactivate、SetObjectRects 和 ReactivateAndUndo。 此介面的支援需要 IOleObject 的支援。 |
IOleInPlaceActiveObject |
支援 IOleInPlaceObject 的就地支援對象也必須提供這個介面,不過控件本身不一定直接實作介面。 |
IOleControl |
表示控件處理 (a) 助記鍵的能力和願望(GetControlInfo、OnMnemonic 方法)、(b) 環境屬性 (OnAmbientPropertyChange) 和/或 (c) 事件,控件要求容器處理 (FreezeEvents)。 請注意,助記鍵與透過 IOleInPlaceActiveObject 處理的快捷鍵不同:助記鍵具有相關聯的 UI,即使控件不在 UI 作用中也一樣。 控件對助記鍵的支援表示控件也知道如何使用容器的 IOleControlSite::OnControlInfoChanged 方法。 由於這需要控件知道容器的網站,因此助記鍵的支援也表示支援 IOleObject。 此外,助記鍵的知識需要就地支援,因此 IOleInPlaceObject。 如果控件使用任何容器環境屬性,則也必須實作此介面來接收變更通知,因為需要遵循變更的語意。 因為環境屬性只能透過容器月臺的 IDispatch 取得,環境屬性支援表示控件支援 IOleObject (若要取得網站),也能夠產生 IDispatch::Invoke 呼叫。 需要 FreezeEvents 方法才能讓必須知道容器何時不會處理事件,這是控件知道此條件的唯一方法。 如果 FreezeEvents 只有在隔離時才需要,因此不會實作其他 IOleControl 方法,則 IOleControl 可以獨立獨立,而不需要 IOleObject 或 IOleInPlaceObject。 |
IDataObject |
指出控制項至少可以提供控制元件的圖形化轉譯 (CF_METAFILEPICT 為控制件具有任何視覺效果的最小值)和/或 (b) 屬性集,如果控制項具有要提供的任何屬性,則為 。 需要 GetData、QueryGetData、EnumFormatEtc、DAdvise、DUnadvise 和 EnumDAdvise 方法。 CF_METAFILEPICT以外的圖形化格式支援是選擇性的。 |
IViewObject2 |
指出當控件不在就地作用中時,有一些有趣的視覺效果。 如果實作,控件必須支援 Draw、GetAdvise、SetAdvise 和 GetExtent 方法。 |
IDispatch |
表示控件具有 (a) 自定義方法,或 (b) 自定義屬性,可透過 IDispatch::Invoke 透過晚期系結取得。 這也需要控件透過其他 IDispatch 方法提供類型資訊。 控件可支援多個 IDispatch 實作,其中只有一個與IID_IDispatch其他控件必須有自己的唯一的散發介面識別碼。 鼓勵控件提供自定義方法和屬性存取的雙重介面,但如果方法和屬性存在,則這是選擇性的。 |
I 連線 ionPointContainer |
表示控件至少支援一個傳出介面,例如事件或屬性變更通知。 如果這個介面完全可用,則必須實作此介面的所有方法,包括 Enum 連線 ionPoints,其需要具有 IEnum 連線 ionPoints 的個別物件。 支援 I 連線 ionPointContainer 表示物件也支援一或多個具有 I 連線 ionPoint 的相關物件,這些物件可透過 I 連線 ionPointContainer 方法取得。 每個連接點物件本身都必須實作完整的 I 連線 ionPoint 介面,包括 Enum 連線 ions,這需要另一個具有 IEnum 連線 ions 介面的列舉值物件。 |
IProvideClassInfo IProvideClassInfo2 |
表示物件可以直接透過 IProvideClassInfo::GetClassInfo 提供自己的 coclass 類型資訊。 如果控件支援稍後的變化 IProvideClassInfo2,則也會指出它透過 IProvideClassInfo2::GetGUID 提供主要來源 IID 的能力。 這個介面的所有方法都必須實作。 |
ISpecifyPropertyPages |
指出控件有屬性頁,它可以顯示,讓容器可以協調此控件的屬性頁與其他控件的頁面,當屬性頁要針對多重控件選取項目顯示時。 當支援存在時,必須實作這個介面的所有方法。 |
IPerPropertyBrowsing |
表示控制件 (a) 提供屬性的顯示字串的能力,(b) 提供其屬性的預先定義字串和值,以及/或 (c) 會將屬性 dispID 對應至特定屬性頁。 此介面的支援表示已提供透過 IDispatch 支援屬性。 如果支援 (c) ,則這也表示對象的屬性頁會透過 IPerPropertyBrowsing::MapPropertyToPage 本身實作 IPropertyPage2,而不是基本的 IPropertyPage 介面。 |
IPersistStream IPersistStreamInit IPersistMemory IPersist 儲存體 IPersistMoniker IPersistPropertyBag |
請參閱 持續性介面。 |
IOleCache IOleCache2 |
表示支援控件視覺效果的容器快取。 控件通常會透過 OLE 函數 CreateDataCache 取得快取支援本身。 只有具有有意義靜態內容的控件才應該選擇執行這項操作(雖然並非必要)。 如果控件完全支援快取,它應該只匯總數據快取,並從數據快取公開 IOleCache 和 IOleCache2 介面。 如果容器提供 IAdviseSink,實作 IOleObject 的控件必須能夠處理 IAdviseSink;在此情況下,控件可能無法確保它不會嘗試呼叫不存在的接收。 |
IExternal 連線 ion |
表示控件支援本身的外部連結;也就是說,控件未標示為 OLEMISC_CANTLINKINSIDE,並支援 IOleObject::SetMoniker 和 IOleObject::GetMoniker。 容器永遠不會查詢此介面本身,也不會直接呼叫它,因為呼叫是從 OLE 遠端層內部產生。 |
IRunnableObject |
指出控件會區別載入與執行中,就像某些同進程對象一樣。 |