介面設計規則
本節提供介面設計規則和指導方針的簡短摘要。 其中有些規則是 COM 架構特有的,而另一些規則則是介面設計語言 MIDL 所施加的限制。 如需 COM 介面設計的詳細資訊,請參閱 IDL 檔案的結構。
根據定義,除非物件實作 IUnknown 介面或衍生自 IUnknown 的介面,否則物件不是 COM 物件。 此外,下列規則適用於 COM 物件上實作的所有介面:
- 它們必須有唯一的介面標識碼(IID)。
- 它們必須是不可變的。 建立和發佈之後,其定義中沒有任何部分可能會變更。
- 所有介面方法都必須傳回 HRESULT 值,讓處理遠端處理的系統部分可以報告 RPC 錯誤。
- 介面方法中的所有字串參數都必須是 Unicode。
- 您的數據類型必須是可遠端的。 如果您無法將數據類型轉換成可遠端類型,則必須建立自己的封送處理和取消封送處理例程。 此外, LPVOID 或 void *,在遠端電腦上沒有意義。 如有必要,請使用 IUnknown 的指標。
注意
MIDL 目前的實作不會處理函式多載或多重繼承。
其他介面設計考慮
非常小心地使用數據的指標。 若要在所呼叫進程的位址空間中重新建立數據,RPC 運行時間必須知道數據的確切大小。 例如, 如果 CHAR * 參數指向字元的緩衝區,而不是指向單一字元,則無法正確重新建立數據。 使用 MIDL 提供的語法,準確描述類型定義所代表的數據結構。
初始化對於內嵌在數位和結構中的指標以及跨進程界限傳遞的指標而言是必要的。 當傳遞至相同進程空間中的程式時,未初始化的指標可能會運作,但 Proxy 和存根會假設所有指標都是以有效位址初始化,或為 Null。
在別名指標時請小心(允許指標指向相同的記憶體片段)。 如果別名是刻意的,這些指標應該在IDL檔案中宣告為別名。 宣告為非鋸齒的指標絕不應該彼此別名。
請注意如何配置和釋放記憶體。 請記住,除非您明確告訴 COM 物件(使用 allocate 屬性)不要釋放在跨進程呼叫期間建立的數據結構,否則該結構會在呼叫完成時終結。 此外,請考慮目前需要封送處理和取消封送處理的數據結構配置所產生的潛在破壞性額外負荷。
最後,定義 HRESULT 傳回值時請小心,以免建立與 COM 定義的FACILITY_ITF碼衝突的錯誤碼(保留0x0000與0x01FF之間的值),或與其他 HRESULT 值發生衝突且具有相同值的錯誤碼。 盡可能使用通用 COM 成功和失敗傳回值,並使用 out 參數,而不是 HRESULT 來傳回函數調用特有的資訊。
如需詳細資訊,請參閱下列主題:
相關主題