適用於 COM 和 .NET 的 C++ 屬性

Microsoft 會定義一組 C++ 屬性,以簡化 COM 程式設計與 .NET Framework Common Language Runtime 開發。 當您在原始程式檔中包含屬性時,編譯器會使用提供者 DLL 來插入程式碼或修改產生的物件檔中的程式碼。 這些屬性有助於建立 .idl 檔案、介面、類型程式庫和其他 COM 元素。 在整合式開發環境中,精靈和屬性視窗支援屬性。

雖然屬性可排除撰寫 COM 物件所需的一些詳細程式碼,但您需要 COM 基本概念 的背景 ,才能充分利用它們。

注意

如果您要尋找 C++ 標準屬性,請參閱 屬性

屬性用途

屬性會以目前不可能的方向延伸 C++,而不會中斷語言的傳統結構。 屬性可讓提供者(個別 DLL)動態擴充語言功能。 除了提高元件開發人員的生產力層級之外,屬性的主要目標是簡化 COM 元件的撰寫。 屬性幾乎可以套用至任何 C++ 建構,例如類別、資料成員或成員函式。 以下是這項新技術所提供的優點重點:

  • 公開熟悉且簡單的呼叫慣例。

  • 使用插入的程式碼,這與宏不同,偵錯工具可辨識。

  • 允許從基類輕鬆衍生,而不需要繁重的實作詳細資料。

  • 以一些簡潔的屬性取代 COM 元件所需的大量 IDL 程式碼。

例如,若要實作泛型 ATL 類別的簡單事件接收,您可以將 event_receiver 屬性套用 至特定的類別,例如 CMyReceiverevent_receiver屬性接著會由 Microsoft C++ 編譯器編譯,它會將適當的程式碼插入物件檔中。

[event_receiver(com)]
class CMyReceiver
{
   void handler1(int i) { ... }
   void handler2(int i, float j) { ... }
}

然後,您可以從事件來源設定 CMyReceiver 方法 handler1handler2 處理事件(使用內部 函數__hook ),您可以使用event_source 建立 事件。

屬性的基本機制

有三種方式可將屬性插入您的專案中。 首先,您可以手動將它們插入原始程式碼中。 其次,您可以使用專案中物件的 屬性方格來插入它們。 最後,您可以使用各種精靈來插入它們。 如需使用 [ 屬性 ] 視窗和各種精靈的詳細資訊,請參閱 Visual Studio 專案 - C++

如同之前,建置專案時,編譯器會剖析每個 C++ 原始程式檔,並產生物件檔。 不過,當編譯器遇到屬性時,會剖析並經過語法驗證。 然後,編譯器會動態呼叫屬性提供者來插入程式碼,或在編譯時期進行其他修改。 提供者的實作會根據屬性的類型而有所不同。 例如,ATL 相關屬性是由 Atlprov.dll 實作。

下圖示范編譯器與屬性提供者之間的關聯性。

Diagram showing component attribute communication.

注意

屬性使用方式不會改變來源檔案的內容。 唯一產生的屬性程式碼會在偵錯會話期間顯示。 此外,針對專案中的每個來源檔案,您可以產生一個文字檔,以顯示內容替代的結果。 如需此程式的詳細資訊,請參閱 /Fx (合併插入的程式碼) 偵錯插入的程式碼

和大部分 C++ 建構一樣,屬性有一組特性,可定義其適當的使用方式。 這稱為屬性的內容,而且會在每個屬性參考主題的屬性內容資料表中定址。 例如, coclass 屬性只能套用至現有的類別或結構,而不是 cpp_quote 屬性,該屬性可以在 C++ 原始程式檔中的任何位置插入。

建置屬性化程式

將 Visual C++ 屬性放入原始程式碼之後,您可能會希望 Microsoft C++ 編譯器為您產生型別程式庫和 .idl 檔案。 下列連結器選項可協助您建置 .tlb 和 .idl 檔案:

某些專案包含多個獨立的 .idl 檔案。 這些檔案可用來產生兩個或多個 .tlb 檔案,並選擇性地將它們系結至資源區塊。 Visual C++ 目前不支援此案例。

此外,Visual C++ 連結器會將所有 IDL 相關屬性資訊輸出到單一 MIDL 檔案。 無法從單一專案產生兩個類型程式庫。

屬性內容

C++ 屬性可以使用四個基本欄位來描述:如果它們可重複或不 重複,則其可套用的目標 (可 重複或不重複)、其他屬性的必要存在性(必要屬性 ),以及與其他屬性 不相容( 不正確屬性 )。 這些欄位會列在每個屬性參考主題的隨附資料表中。 以下說明上述每個欄位。

套用至

此欄位描述不同 C++ 語言元素,這些元素是指定屬性的法律目標。 例如,如果屬性在 [套用至 ] 欄位中指定 「class」,這表示屬性只能套用至合法的 C++ 類別。 如果屬性套用至類別的成員函式,則會產生語法錯誤。

如需詳細資訊,請參閱 依使用方式 的屬性。

可重複

此欄位會指出屬性是否可以重複套用至相同的目標。 大部分的屬性不可重複。

必要的屬性

此欄位會列出必須存在的其他屬性(也就是套用至相同的目標),才能讓指定的屬性正常運作。 屬性對於此欄位的任何專案來說並不常見。

不正確屬性

此欄位會列出其他與指定屬性不相容的屬性。 屬性對於此欄位的任何專案來說並不常見。

對插入程式碼進行偵錯

使用屬性可以大幅簡化 C++ 程式設計。 如需詳細資訊,請參閱 概念 。 有些屬性 (Attribute) 可以直接由編譯器 (Compiler) 解譯。 其他屬性 (Attribute) 會將程式碼插入到編譯器將編譯的程式來源中。 這種插入的程式碼可藉著減少必須由您撰寫的程式碼數量,使程式設計更為容易。 然而,有時一個錯誤便可能會造成應用程式在執行插入程式碼時失敗。 當這種情況發生時,您可能要查看插入程式碼。 Visual Studio 提供兩種讓您查看插入程式碼的方法:

  • 您可以在 [反組譯碼] 視窗中檢視插入程式碼。

  • 使用 /Fx,您可以建立包含原始和插入程式碼的合併來源檔案。

[反組譯碼] 視窗會顯示與原始程式碼和由屬性插入之程式碼對應的組合語言指令。 此外,[反組譯碼] 視窗可以顯示原始程式碼註釋。

若要開啟來源附註

  • 以滑鼠右鍵按一下 [反組譯碼] 視窗,並從捷徑功能表選擇 [顯示原始程式碼]

    如果您知道屬性在來源視窗的位置,您就可以使用捷徑功能表在 [反組譯碼] 視窗裡尋找插入程式碼。

若要檢視插入程式碼

  1. 偵錯工具必須處於中斷模式。

  2. 在原始程式碼視窗裡,將游標放置在您要檢視的插入程式碼的屬性之前。

  3. 以滑鼠右鍵按一下,並從捷徑功能表選取 [前往反組譯碼]

    如果屬性位置距離目前執行點很近,您只要從 [偵錯] 功能表選取 [反組譯碼] 視窗即可。

若要檢視目前執行點的反組譯程式碼

  1. 偵錯工具必須處於中斷模式。

  2. 請在 [偵錯] 功能表中選擇 [視窗],然後按一下 [反組譯碼]

本節內容

屬性程式設計常見問題集
依群組分類的屬性
依使用方式分類的屬性
依字母順序排列的屬性參考