object 屬性
[object]介面屬性會識別 COM 介面。 (不包含 [object] 屬性的介面屬性清單表示 DCE RPC 介面。)
[
object,
uuid(string-uuid)
[ , interface-attribute-list]
]
interface interface-name : base-interface
{
...
}
-
string-uuid
-
Uuidgen 公用程式所產生的 UUID 字串。 您可以用引號括住 UUID 字串。
-
interface-attribute-list
-
套用至整個介面的其他屬性。
-
interface-name
-
介面的名稱。
-
base-interface
-
這個介面衍生自其中的 COM 介面。 基底介面必須是 IUnknown、 IDispatch或其他衍生自 IUnknown 或 IDispatch的 COM 介面。
COM 介面的介面屬性清單必須包含 [uuid] 屬性,但不能包含 [version] 屬性。
根據預設,使用 MIDL 編譯器編譯 COM 介面會產生建置 Proxy DLL 所需的檔案。 此 DLL 包含程式碼,可支援用戶端應用程式和物件服務器使用自訂 COM 介面。 不過,如果 COM 介面的介面屬性清單指定 [local] 屬性,MIDL 編譯器只會產生介面標頭檔。
MIDL 編譯器會自動產生 COM 介面的介面資料類型。 或者,您可以使用 typedef 搭配 interface 關鍵字來明確定義介面資料類型。 介面規格接著可以在函式參數中使用介面資料類型,並傳回值、 結構 與 等位 成員,以及其他類型宣告。 下列範例說明如何使用自動產生的 IStream 資料類型:
[
object,
uuid (ABCDEFOO-1234-1234-5678-ABCDEF123456)
]
interface IStream : IUnknown
{
typedef IStream * LPSTREAM;
// Other interface definition statements.
}
在 COM 介面中,所有介面成員函式都會假設為虛擬函式。 虛擬函式具有隱含 這個 指標作為第一個參數。 虛擬函式資料表包含每個介面成員函式的專案。
非[local] 物件介面成員函式必須具有 HRESULT 或 SCODE 的傳回值。 (請注意,舊版 MIDL 允許成員函式傳回 void。不過,從 MIDL 3.0 版開始,傳回 void 會產生編譯器錯誤。) 具有 HRESULT 或 SCODE 的傳回值表示如果在遠端呼叫期間產生例外狀況,則產生的 Proxy 會攔截例外狀況,並在傳回值中傳回例外狀況代碼。 如果您的應用程式能夠忽略遠端程序呼叫期間發生的錯誤,您可以將 HRESULT 指定為傳回類型,而不需在呼叫之後檢查傳回值。
如果您要重新編譯舊應用程式,當伺服器將新導入的結果傳送給用戶端時,變更傳回型別可能會造成回溯相容性問題。 除了變更傳回型別,您也可以使用[call_as]屬性來標記傳回void的函式,使其成為本機函式。 然後使用相同的參數來定義相關的遠端函式,但具有 HRESULT 的傳回類型。 如有需要,本機函式可以根據該 HRESULT 值引發例外狀況。
當您使用 MIDL 編譯器/osf參數進行編譯時,無法使用[object]屬性。
[
uuid(12345678-1234-1234-1234-123456789ABC),
object
]
interface IMyInterface : IUnknown
{
// Interface definition statements.
}
[
uuid(87654321-1234-1234-1234-123456789ABC),
object,
local
]
interface ILocalInterface : ISomeOldCOMInterface
{
// Interface definition statements.
}