適用於 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 屬性套用至特定的類別,例如 CMyReceiver
。 event_receiver
屬性接著會由Microsoft C++編譯程式編譯,而編譯程式會將適當的程序代碼插入物件檔中。
[event_receiver(com)]
class CMyReceiver
{
void handler1(int i) { ... }
void handler2(int i, float j) { ... }
}
然後,您可以從事件來源設定 CMyReceiver
方法handler1
並handler2
處理事件(使用內部函數__hook),您可以使用event_source建立事件。
屬性的基本機制
有三種方式可將屬性插入您的專案中。 首先,您可以手動將它們插入原始程式碼中。 其次,您可以使用項目中物件的 屬性方格來插入它們。 最後,您可以使用各種精靈來插入它們。 如需使用 [ 屬性 ] 視窗和各種精靈的詳細資訊,請參閱 Visual Studio Projects - C++。
如同先前,建置專案時,編譯程式會剖析每個C++原始程序檔,併產生物件檔。 不過,當編譯程式遇到屬性時,會剖析並經過語法驗證。 然後,編譯程式會動態呼叫屬性提供者來插入程序代碼,或在編譯時期進行其他修改。 提供者的實作會根據屬性的類型而有所不同。 例如,ATL 相關屬性是由 Atlprov.dll 實作。
下圖示範編譯程式與屬性提供者之間的關聯性。
注意
屬性使用方式不會改變來源檔案的內容。 唯一產生的屬性程序代碼會在偵錯會話期間顯示。 此外,針對專案中的每個來源檔案,您可以產生一個文字檔,以顯示屬性替代的結果。 如需此程式的詳細資訊,請參閱 /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,您可以建立包含原始和插入程式碼的合併來源檔案。
[反組譯碼] 視窗會顯示與原始程式碼和由屬性插入之程式碼對應的組合語言指令。 此外,[反組譯碼] 視窗可以顯示原始程式碼註釋。
若要開啟來源附註
以滑鼠右鍵按一下 [反組譯碼] 視窗,並從捷徑功能表選擇 [顯示原始程式碼]。
如果您知道屬性在來源視窗的位置,您就可以使用捷徑功能表在 [反組譯碼] 視窗裡尋找插入程式碼。
若要檢視插入程式碼
偵錯工具必須處於中斷模式。
在原始程式碼視窗裡,將游標放置在您要檢視的插入程式碼的屬性之前。
以滑鼠右鍵按一下,並從捷徑功能表選取 [前往反組譯碼]。
如果屬性位置距離目前執行點很近,您只要從 [偵錯] 功能表選取 [反組譯碼] 視窗即可。
若要檢視目前執行點的反組譯程式碼
偵錯工具必須處於中斷模式。
請在 [偵錯] 功能表中選擇 [視窗],然後按一下 [反組譯碼]。