共用方式為


調試程序數據模型 C++ 物件

本主題描述如何使用調試程序數據模型 C++ 物件,以及如何擴充調試程式的功能。

核心調試程序物件模型

數據模型最基本但最強大的內容之一是,它會標準化對象的定義,以及對象與對象互動的方式。 IModelObject 介面會封裝物件的概念-- 不論該對像是整數、浮點值、字串、調試程式目標地址空間中的某些複雜型別,或是一些調試程式概念,例如進程或模組的概念。

IModelObject 中可以保留數個不同的專案:(或 Boxed 到) 中:

  • 內建值 - IModelObject 可以是許多基本類型的容器:8、16、32 或 64 位帶正負號或無符號整數、布爾值、字元串、錯誤或空白的概念。

  • 原生物件 - IModelObject 可以在除錯程式的位址空間內代表複雜類型(如除錯程式的類型系統所定義)

  • 綜合物件 - IModelObject 可以是動態物件 -- 如果您將會是字典:索引鍵/值/元數據元組的集合,以及一組 概念 ,定義不只以索引鍵/值組表示的行為。

  • 屬性 - IModelObject 可以代表屬性:可以使用方法呼叫來擷取或改變其值的專案。 IModelObject 中的屬性實際上是將IModelPropertyAccessor 介面 Boxed 到 IModelObject

  • 方法 - IModelObject 可以代表方法:您可以使用一組自變數呼叫的專案,並取得傳回值。 IModelObject 內的方法實際上是將IModelMethod 介面 Boxed 到IModelObject

物件模型中的擴充性

IModelObject 不是隔離的物件。 除了代表上述其中一種物件類型之外,每個物件都有父數據模型鏈結的概念。 此鏈結的行為與 JavaScript 原型鏈結非常類似。 每個數據模型物件會定義父模型的線性鏈結,而不是 JavaScript 等原型的線性鏈結。 每個父模型都會有另一個自己的父系線性鏈結。 基本上,每個物件都是本身和這個樹狀結構中每個物件的功能(屬性等...)匯總。 查詢特定屬性時,如果查詢的物件不支援該屬性,查詢會依線性順序傳遞至每個父系。 這會建立行為,其中搜尋屬性會透過匯總樹狀結構的深度優先搜尋來解析。

這個物件模型中的擴充性非常簡單,因為這個概念是每個物件都是本身的匯總和父模型的樹狀結構。 延伸模組可以傳入並新增至另一個物件的父模型清單。 這樣做會擴充 物件。 如此一來,就可以將功能新增至任何專案:物件或值的特定實例、原生類型、調試程式的程式或線程概念,甚至是「所有可反覆運算的物件」的概念。

內容、內容和內容: 指標、位址空間和實作私用數據

有三種 內容 概念,在物件模型的內容中必須瞭解。

內容: 指標

由於指定的屬性或方法可以在數據模型樹狀結構的任何層級實作,因此實作方法或屬性必須能夠存取原始物件(您可以在 C++ 中呼叫此指標,或在 JavaScript 中呼叫這個物件。 該實例物件會傳遞至各種方法,做為所描述方法中稱為 內容 的第一個自變數。

內容:位址空間

請務必注意,不同於先前的延伸模組模型,內容(目標、進程、您查看的線程)是一種UI概念,具有與目前UI狀態相關的所有API,數據模型介面通常會明確或隱含地採用此內容作為IDebugHostContext 介面。 數據模型中的每個 IModelObject 都會攜帶這種類型的內容資訊,而且可以將該內容傳播至傳回的物件。 這表示當您從IModelObject 讀取原生值或索引鍵值時,它會從目標讀取,並處理原本從中取得物件的位置。

有明確的常數值 USE_CURRENT_HOST_CONTEXT,可以傳遞至採用 IDebugHostContext 自變數的方法。 這個值表示內容確實應該是調試程式的目前UI狀態。 不過,這個概念確實需要明確。

內容:實作私人數據

請記住,數據模型中的每一個對象實際上是對象實例的匯總,以及附加的父模型樹狀結構。 每個父模型(可以在許多不同的對象的鏈結中連結)都可以將私人實作數據與任何實例對象產生關聯。 每個以概念方式建立的IModelObject 都有一個哈希表,該哈希表會從特定父模型對應至IUnknown 介面所定義的私用實例數據。 這可讓父模型快取每個實例的資訊,或具有相關聯的任意數據。

這種類型的內容是透過IModelObject上的 GetContextForDataModel 和 SetContextForDataModel 方法存取。

核心調試程序物件介面: IModelObject


IModelObject 介面的定義如下:

DECLARE_INTERFACE_(IModelObject, IUnknown)
{
    STDMETHOD(QueryInterface)(_In_ REFIID iid, _COM_Outptr_ PVOID* iface);
    STDMETHOD_(ULONG, AddRef)();
    STDMETHOD_(ULONG, Release)() PURE;
    STDMETHOD(GetContext)(_COM_Outptr_result_maybenull_ IDebugHostContext** context) PURE;
    STDMETHOD(GetKind)(_Out_ ModelObjectKind *kind) PURE;
    STDMETHOD(GetIntrinsicValue)(_Out_ VARIANT* intrinsicData);
    STDMETHOD(GetIntrinsicValueAs)(_In_ VARTYPE vt, _Out_ VARIANT* intrinsicData) PURE;
    STDMETHOD(GetKeyValue)(_In_ PCWSTR key, _COM_Errorptr_opt_ IModelObject** object, _COM_Outptr_opt_result_maybenull_ IKeyStore** metadata) PURE;
    STDMETHOD(SetKeyValue)(_In_ PCWSTR key, _In_opt_ IModelObject* object) PURE;
    STDMETHOD(EnumerateKeyValues)(_COM_Outptr_ IKeyEnumerator** enumerator) PURE;
    STDMETHOD(GetRawValue)(_In_ SymbolKind kind, _In_ PCWSTR name, _In_ ULONG searchFlags, _COM_Errorptr_ IModelObject** object) PURE;
    STDMETHOD(EnumerateRawValues)(_In_ SymbolKind kind, _In_ ULONG searchFlags, _COM_Outptr_ IRawEnumerator** enumerator) PURE;
    STDMETHOD(Dereference)(_COM_Errorptr_ IModelObject** object) PURE;
    STDMETHOD(TryCastToRuntimeType)(_COM_Errorptr_ IModelObject** runtimeTypedObject) PURE;
    STDMETHOD(GetConcept)(_In_ REFIID conceptId, _COM_Outptr_ IUnknown** conceptInterface, _COM_Outptr_opt_result_maybenull_ IKeyStore** conceptMetadata) PURE;
    STDMETHOD(GetLocation)(_Out_ Location* location) PURE;
    STDMETHOD(GetTypeInfo)(_Out_ IDebugHostType** type) PURE;
    STDMETHOD(GetTargetInfo)(_Out_ Location* location, _Out_ IDebugHostType** type) PURE;
    STDMETHOD(GetNumberOfParentModels)(_Out_ ULONG64* numModels) PURE;
    STDMETHOD(GetParentModel)(_In_ ULONG64 i, _COM_Outptr_ IModelObject **model, _COM_Outptr_result_maybenull_ IModelObject **contextObject) PURE;
    STDMETHOD(AddParentModel)(_In_ IModelObject* model, _In_opt_ IModelObject* contextObject, _In_ bool override) PURE;
    STDMETHOD(RemoveParentModel)(_In_ IModelObject* model) PURE;
    STDMETHOD(GetKey)(_In_ PCWSTR key, _COM_Errorptr_opt_ IModelObject** object, _COM_Outptr_opt_result_maybenull_ IKeyStore** metadata) PURE;
    STDMETHOD(GetKeyReference)(_In_ PCWSTR key, _COM_Errorptr_opt_ IModelObject** objectReference, _COM_Outptr_opt_result_maybenull_ IKeyStore** metadata) PURE;
    STDMETHOD(SetKey)(_In_ PCWSTR key, _In_opt_ IModelObject* object, _In_opt_ IKeyStore* metadata) PURE;
    STDMETHOD(ClearKeys)() PURE;
    STDMETHOD(EnumerateKeys)(_COM_Outptr_ IKeyEnumerator** enumerator) PURE;
    STDMETHOD(EnumerateKeyReferences)(_COM_Outptr_ IKeyEnumerator** enumerator) PURE;
    STDMETHOD(SetConcept)(_In_ REFIID conceptId, _In_ IUnknown* conceptInterface, _In_opt_ IKeyStore* conceptMetadata) PURE;
    STDMETHOD(ClearConcepts)() PURE;
    STDMETHOD(GetRawReference)(_In_ SymbolKind kind, _In_ PCWSTR name, _In_ ULONG searchFlags, _COM_Errorptr_ IModelObject** object) PURE;
    STDMETHOD(EnumerateRawReferences)(_In_ SymbolKind kind, _In_ ULONG searchFlags, _COM_Outptr_ IRawEnumerator** enumerator) PURE;
    STDMETHOD(SetContextForDataModel)(_In_ IModelObject* dataModelObject, _In_ IUnknown* context) PURE;
    STDMETHOD(GetContextForDataModel)(_In_ IModelObject* dataModelObject, _Out_ IUnknown** context) PURE;
    STDMETHOD(Compare)(_In_ IModelObject* other, _COM_Outptr_opt_result_maybenull_ IModelObject **ppResult) PURE;
    STDMETHOD(IsEqualTo)(_In_ IModelObject* other, _Out_ bool* equal) PURE;
}

基本方法

以下是適用於IModelObject所表示之任何物件類型的一般方法。

STDMETHOD(GetKind)(_Out_ ModelObjectKind *kind) PURE;
STDMETHOD(GetContext)(_COM_Outptr_result_maybenull_ IDebugHostContext** context) PURE;
STDMETHOD(GetIntrinsicValue)(_Out_ VARIANT* intrinsicData);
STDMETHOD(GetIntrinsicValueAs)(_In_ VARTYPE vt, _Out_ VARIANT* intrinsicData) PURE;
STDMETHOD(Compare)(_In_ IModelObject* other, _COM_Outptr_opt_result_maybenull_ IModelObject **ppResult) PURE;
STDMETHOD(IsEqualTo)(_In_ IModelObject* other, _Out_ bool* equal) PURE;
STDMETHOD(Dereference)(_COM_Errorptr_ IModelObject** object) PURE;

GetKind

GetKind 方法會傳回IModelObject內的Boxed物件種類。

GetContext

GetContext 方法會傳回與 對象相關聯的主機內容。

GetIntrinsicValue

GetIntrinsicValue 方法會傳回在 IModelObject 內方塊化的東西。 這個方法只能在IModelObject 介面上合法呼叫,該介面代表 Boxed 內部函數或已 Boxed 的特定介面。 它無法在原生對象、沒有值對象、綜合對象和參考物件上呼叫。 GetIntrinsicValueAs 方法的行為與 GetIntrinsicValue 方法相同,不同之處在於它會將值轉換成指定的變體類型。 如果無法執行轉換,此方法會傳回錯誤。

IsEqualTo

IsEqualTo 方法會比較兩個模型物件,並傳回它們是否等於值。 對於具有排序的對象,這個傳回 true 的方法相當於傳回 0 的 Compare 方法。 對於沒有排序但相等的物件,Compare 方法將會失敗,但這不會。 以值為基礎的比較的意義是由 物件類型所定義。 目前,這隻會針對內部類型和錯誤物件定義。 目前沒有等號的數據模型概念。

Dereference

Dereference 方法會取值 物件。 這個方法可用來取值以數據模型為基礎的參考(ObjectTargetObjectReference、ObjectKeyReference)或原生語言參考(指標或語言參考)。 請務必注意,這個方法會移除 物件上的單一參考語意層級。 例如,完全可以有語言參考的數據模型參考。 在這種情況下,第一次呼叫 Dereference 方法會移除數據模型參考,並保留語言參考。 在該產生的物件上呼叫 Dereference 會接著移除語言參考,並傳回該參考下的原生值。

索引鍵操作方法

任何綜合物件都是索引鍵、值和元數據元組的字典,都有一系列方法來操作這些索引鍵、值和與其相關聯的元數據。

以值為基礎的 API 形式如下:

STDMETHOD(GetKeyValue)(_In_ PCWSTR key, _COM_Errorptr_opt_ IModelObject** object, _COM_Outptr_opt_result_maybenull_ IKeyStore** metadata) PURE;
STDMETHOD(SetKeyValue)(_In_ PCWSTR key, _In_opt_ IModelObject* object) PURE;
STDMETHOD(EnumerateKeyValues)(_COM_Outptr_ IKeyEnumerator** enumerator) PURE;
The key based forms of the APIs (including those used for key creation) are: 
STDMETHOD(GetKey)(_In_ PCWSTR key, _COM_Errorptr_opt_ IModelObject** object, _COM_Outptr_opt_result_maybenull_ IKeyStore** metadata) PURE;
STDMETHOD(SetKey)(_In_ PCWSTR key, _In_opt_ IModelObject* object, _In_opt_ IKeyStore* metadata) PURE;
STDMETHOD(EnumerateKeys)(_COM_Outptr_ IKeyEnumerator** enumerator) PURE;
STDMETHOD(ClearKeys)() PURE;

API 的參考型形式如下:

STDMETHOD(GetKeyReference)(_In_ PCWSTR key, _COM_Errorptr_opt_ IModelObject** objectReference, _COM_Outptr_opt_result_maybenull_ IKeyStore** metadata) PURE;
STDMETHOD(EnumerateKeyReferences)(_COM_Outptr_ IKeyEnumerator** enumerator) PURE;

GetKeyValue

GetKeyValue 方法是客戶端將轉換成的第一個方法,以便依名稱取得指定索引鍵的值(和相關聯的元數據)。 如果索引鍵是屬性存取子,也就是它是IModelObject的值,也就是Boxed IModelPropertyAccessor,GetKeyValue 方法會自動呼叫屬性存取子的 GetValue 方法,以擷取實際值。

SetKeyValue

SetKeyValue 方法是客戶端要用來設定索引鍵值的第一個方法。 這個方法無法用來在物件上建立新的索引鍵。 它只會設定現有索引鍵的值。 請注意,許多索引鍵都是只讀的(例如:它們是由從它的 SetValue 方法傳回E_NOT_IMPL的屬性存取子所實作。 此方法會在只讀金鑰上呼叫時失敗。

EnumerateKeyValues

EnumerateKeyValues 方法是用戶端將轉換成的第一種方法,以便列舉物件上的所有索引鍵(這包括父模型樹狀結構中任何位置實作的所有索引鍵)。 請務必注意,EnumerateKeyValues 會列舉物件樹狀結構中重複名稱所定義的任何索引鍵:不過 -- GetKeyValue 和 SetKeyValue 等方法只會操作具有深度優先周遊所探索指定名稱之索引鍵的第一個實例。

GetKey

GetKey 方法會依名稱取得指定索引鍵的值(和相關聯的元數據)。 大部分的客戶端都應該改用 GetKeyValue 方法。 如果索引鍵是屬性存取子,則呼叫這個方法會傳回 Boxed 到 IModelObject 中的屬性存取子(IModelPropertyAccessor 介面)。 不同於 GetKeyValue,此方法不會藉由呼叫 GetValue 方法自動解析索引鍵的基礎值。 責任是來電者的責任。

SetKey

SetKey 方法是用戶端將轉換成的方法,以便在物件上建立索引鍵(並可能將元數據與建立的密鑰產生關聯)。 如果指定的物件已經有具有指定名稱的索引鍵,則會發生兩種行為之一。 如果索引鍵位於這個 指定的實例上,則會取代該索引鍵的值,就像原始索引鍵不存在一樣。 另一方面,如果索引鍵位於這個所指定實例的父數據模型鏈結中,則會在此指定的實例上建立具有指定名稱的新索引鍵。 實際上,這會導致物件有兩個相同名稱的索引鍵(類似於陰影與基類相同名稱成員的衍生類別)。

EnumerateKeys

EnumerateKeys 方法的行為與 EnumerateKeyValues 方法類似,不同之處在於它不會自動解析物件上的屬性存取子。 這表示,如果索引鍵的值是屬性存取子,EnumerateKeys 方法會傳回 Boxed 到 IModelObject 中的屬性存取子(IModelPropertyAccessorInterface),而不是自動呼叫 GetValue 方法。 這類似於 GetKey 和 GetKeyValue 之間的差異。

ClearKeys

ClearKeys 方法會從這個所指定對象的實例中移除所有索引鍵及其相關聯的值和元數據。 這個方法不會影響附加至特定物件實例的父模型。

GetKeyReference

GetKeyReference 方法會搜尋物件上指定名稱的索引鍵(或其父模型鏈結),並傳回 IModelKeyReference 介面所指定 IModelObject 所指定索引鍵的參考。 該參考隨後可用來取得或設定索引鍵的值。

EnumerateKeyReferences

EnumerateKeyReferences 方法的行為與 EnumerateKeyValues 方法類似,不同之處在於它會傳回列舉之索引鍵的參考(由 Boxed 為 IModelObject 的 IModelKeyReference 介面所指定),而不是索引鍵的值。 這類參考可用來取得或設定索引鍵的基礎值。

概念操作方法

除了模型對像是索引鍵/值/元數據元組的字典之外,它也是概念的容器。 概念是可以在物件上或由 對象執行的抽象概念。 概念基本上是物件支援的介面動態存放區。 目前數據模型會定義一些概念:

概念介面 描述
IDataModelConcept 概念是父模型。 如果此模型透過已註冊的類型簽章自動附加至原生類型,則每次具現化這類類型的新物件時,都會自動呼叫 InitializeObject 方法。
IStringDisplayableConcept 對象可以轉換成字串以供顯示之用。
IIterableConcept 對像是容器,可以進行一次查看。
IIndexableConcept 對像是容器,可以在一或多個維度中編製索引(透過隨機存取)。
IPreferredRuntimeTypeConcept 物件更瞭解衍生自的類型,而不是基礎類型系統能夠提供,而且想要處理其從靜態到運行時間類型的轉換。
IDynamicKeyProviderConcept 對像是索引鍵的動態提供者,希望從核心數據模型接管所有密鑰查詢。 此介面通常用來作為動態語言的網橋,例如 JavaScript。
IDynamicConceptProviderConcept 對像是概念的動態提供者,希望從核心數據模型接管所有概念查詢。 此介面通常用來作為動態語言的網橋,例如 JavaScript。

IModelObject 上的下列方法可用來操作物件支援的概念。

STDMETHOD(GetConcept)(_In_ REFIID conceptId, _COM_Outptr_ IUnknown** conceptInterface, _COM_Outptr_opt_result_maybenull_ IKeyStore** conceptMetadata) PURE;
STDMETHOD(SetConcept)(_In_ REFIID conceptId, _In_ IUnknown* conceptInterface, _In_opt_ IKeyStore* conceptMetadata) PURE;
STDMETHOD(ClearConcepts)() PURE;

GetConcept

GetConcept 方法會搜尋物件上的概念(或其父模型鏈結),並傳回概念介面的介面指標。 概念介面上的行為和方法專屬於每個概念。 不過,請務必注意,許多概念介面需要呼叫者明確傳遞內容物件(或傳統上可能呼叫此指標的內容物件)。 請務必確保將正確的內容對象傳遞至每個概念介面。

SetConcept

SetConcept 方法會將指定的概念放在這個指標所指定的物件實例上。 如果附加到這個指定物件實例的父模型也支援這個概念,則 實體中的實作將會覆寫父模型中的 。

ClearConcepts

ClearConcepts 方法會從這個 所指定對象的實例中移除所有概念。

Native 物件方法

雖然許多模型對象參考內部函數(例如:整數、字串)或綜合建構(索引鍵/值/元數據元組和概念的字典),但模型物件也可能參考原生建構(例如:偵錯目標地址空間中的使用者定義類型)。 IModelObject 介面上有一系列方法,可存取這類原生對象的相關信息。 這些方法是:

STDMETHOD(GetRawValue)(_In_ SymbolKind kind, _In_ PCWSTR name, _In_ ULONG searchFlags, _COM_Errorptr_ IModelObject** object) PURE;
STDMETHOD(EnumerateRawValues)(_In_ SymbolKind kind, _In_ ULONG searchFlags, _COM_Outptr_ IRawEnumerator** enumerator) PURE;
STDMETHOD(TryCastToRuntimeType)(_COM_Errorptr_ IModelObject** runtimeTypedObject) PURE;
STDMETHOD(GetLocation)(_Out_ Location* location) PURE;
STDMETHOD(GetTypeInfo)(_Out_ IDebugHostType** type) PURE;
STDMETHOD(GetTargetInfo)(_Out_ Location* location, _Out_ IDebugHostType** type) PURE;
STDMETHOD(GetRawReference)(_In_ SymbolKind kind, _In_ PCWSTR name, _In_ ULONG searchFlags, _COM_Errorptr_ IModelObject** object) PURE;
STDMETHOD(EnumerateRawReferences)(_In_ SymbolKind kind, _In_ ULONG searchFlags, _COM_Outptr_ IRawEnumerator** enumerator) PURE;

GetRawValue

GetRawValue 方法會在指定的 物件內尋找原生建構。 這類建構可能是欄位、基類、基類中的欄位、成員函式等...

EnumerateRawValues

EnumerateRawValues 方法會列舉指定物件的所有原生子系(例如:欄位、基類等...)。

TryCastToRuntimeType

TryCastToRuntimeType 方法會要求偵錯主機執行分析,並判斷指定對象的實際運行時間類型(例如:大多數衍生類別)。 使用的確切分析專屬於偵錯主機,且可能包含 RTTI(C++ 執行時間類型資訊)、檢查物件的 V-Table(虛擬函式數據表)結構,或任何其他方法,主機可以使用 ,從靜態類型可靠地判斷動態/運行時間類型。 無法轉換成運行時間類型,並不表示這個方法呼叫將會失敗。 在這種情況下,方法會傳回輸出自變數中的指定物件(此指標)。

GetLocation

GetLocation 方法會傳回原生物件的位置。 雖然這類位置通常是偵錯目標位址空間內的虛擬位址,但不一定如此。 這個方法傳回的位置是一個抽象位置,可能是虛擬位址、表示緩存器或子緩存器內的位置,或可能表示偵錯主機所定義的一些其他任意地址空間。 如果產生的Location物件的HostDefined字段是0,表示位置實際上是虛擬位址。 藉由檢查結果位置的 Offset 字段,即可擷取這類虛擬位址。 HostDefined 欄位的任何非零值都表示替代位址空間,其中 Offset 欄位是該位址空間內的位移。 此處非零 HostDefined 值的確切意義對偵錯主機是私人的。

GetTypeInfo

GetTypeInfo 方法會傳回指定物件的原生類型。 如果對象沒有與其相關聯的原生類型資訊(例如:它是內建等...),則呼叫仍會成功,但會傳回 Null。

GetTargetInfo

GetTargetInfo 方法實際上是 GetLocation 和 GetTypeInfo 方法的組合,可傳回抽象位置和指定物件的原生類型。

GetRawReference

GetRawReference 方法會在指定的 對象內尋找原生建構,並傳回它的參考。 這類建構可能是欄位、基類、基類中的欄位、成員函式等...請務必區分這裡傳回的參考(ObjectTargetObjectReference 類型的物件)與語言參考(例如:C++ 和 或 && 樣式參考)。

EnumerateRawReferences

EnumerateRawReferences 方法會列舉指定物件之所有原生子系的參考(例如:字段、基類等...)。

擴充性方法

如先前所述,模型對象的行為非常類似 JavaScript 物件及其原型鏈結。 除了由指定的IModelObject 介面所代表的實例之外,可能還會有一個任意數目的父模型附加至物件(而每個模型可能都有附加的任意數目父模型)。 這是數據模型內擴充性的主要方法。 如果指定的屬性或概念不能位於指定的實例內,則會執行在 實例上根目錄之物件樹狀結構(由父模型定義)的深度優先搜尋。

下列方法會操作與指定IModelObject 實例相關聯的父模型鏈結:

STDMETHOD(GetNumberOfParentModels)(_Out_ ULONG64* numModels) PURE;
STDMETHOD(GetParentModel)(_In_ ULONG64 i, _COM_Outptr_ IModelObject **model, _COM_Outptr_result_maybenull_ IModelObject **contextObject) PURE;
STDMETHOD(AddParentModel)(_In_ IModelObject* model, _In_opt_ IModelObject* contextObject, _In_ bool override) PURE;
STDMETHOD(RemoveParentModel)(_In_ IModelObject* model) PURE;
STDMETHOD(SetContextForDataModel)(_In_ IModelObject* dataModelObject, _In_ IUnknown* context) PURE;
STDMETHOD(GetContextForDataModel)(_In_ IModelObject* dataModelObject, _Out_ IUnknown** context) PURE;

GetNumberOfParentModels

GetNumberOfParentModels 方法會傳回附加至指定物件實例的父模型數目。 父模型會在父模型鏈結的線性順序中先搜尋屬性深度。

GetParentModel

GetParentModel 方法會傳回指定物件父模型鏈結中的第 i 個父模型。 父模型會依新增或列舉的線性順序搜尋屬性或概念。 索引 i 為零的父模型會在索引 i + 1 的父模型之前搜尋(階層式)。

AddParentModel

AddParentModel 方法會將新的父模型新增至指定的 物件。 這類模型可以在搜尋鏈結的結尾加入(覆寫自變數指定為 false),或在搜尋鏈結的前面新增(覆寫自變數指定為 true)。 此外,每個父模型可以選擇性地針對指定父系上的任何屬性或概念調整內容(語意此指標)。或在其父階層中的任何人。 很少使用內容調整,但允許一些強大的概念,例如物件內嵌、建構命名空間等等...

RemoveParentModel

RemoveParentModel 會從指定物件的父搜尋鏈結中移除指定的父模型。

SetContextForDataModel

SetContextForDataModel 方法是由數據模型的實作用來將實作數據放在實例物件上。 就概念而言,每個IModelObject (為簡單起見呼叫這個實例)都包含狀態的哈希表。 哈希表是由另一個IModelObject所編製索引(為了簡單起見,請呼叫此數據模型),該模型位於 實例的父模型階層中。 這個哈希中包含的值是一組由IUnknown 實例表示的參考計數狀態資訊。 一旦數據模型在 實例上設定此狀態,它就可以儲存任意實作數據,這些實作數據可以在屬性 getter 等專案期間擷取。

GetContextForDataModel

GetContextForDataModel 方法可用來擷取先前呼叫 SetContextForDataModel 所設定的內容資訊。 這會擷取實例物件上由實例物件父模型階層中進一步向上的數據模型所設定的狀態資訊。 如需此內容/狀態及其意義的詳細資訊,請參閱 SetContextForDataModel 的檔。

調試程序數據模型核心物件類型

數據模型中的物件類似於 .NET 中的 Object 概念。 這是一般容器,可建構數據模型瞭解的 Boxed。 除了原生對象和綜合物件(動態)物件之外,還有一系列的核心物件類型,可以放置於IModelObject 的容器中。。 放置這些值大部分的容器是標準 COM/OLE VARIANT,其中會放置一些額外的限制,以放置該 VARIANT 可包含的內容。 其中最基本的類型如下:

  • 8 位不帶正負號和帶正負號的值(VT_UI1、VT_I1)
  • 16 位無符號和帶正負號的值(VT_UI2、VT_UI2)
  • 32 位無符號和帶正負號的值(VT_UI4、VT_I4)
  • 64 位無符號和帶正負號的值(VT_UI8、VT_I8)
  • 單精度和雙精確度浮點數(VT_R4、VT_R8)
  • 字串 (VT_BSTR)
  • 布林值 (VT_BOOL)

除了這些基本類型之外,許多核心數據模型物件會放入IModelObject 中,由VT_UNKNOWN定義,其中儲存的IUnknown 保證會實作特定的介面。 這些類型包括:

  • 屬性存取子 (IModelPropertyAccessor)
  • 方法物件 (IModelMethod)
  • 索引鍵參考物件 (IModelKeyReference 或 IModelKeyReference2)
  • 内容物件 (IDebugModelHostContext)

屬性存取子: IModelPropertyAccessor

數據模型中的屬性存取子是IModelPropertyAccessor 介面的實作,該介面會格式化為IModelObject。 查詢時,模型對象會傳回 ObjectPropertyAccessor 的種類,而內建值是保證可查詢 IModelPropertyAccessor 的VT_UNKNOWN。 在此程式中,它保證可靜態轉換成 IModelPropertyAccessor。

屬性存取子是取得取得數據模型中索引鍵值的方法呼叫的間接方式。 如果指定的索引鍵值是屬性存取子,GetKeyValue 和 SetKeyValue 方法會自動注意到這一點,並視需要呼叫屬性存取子的基礎 GetValue 或 SetValue 方法。

IModelPropertyAccessor 介面的定義如下:

DECLARE_INTERFACE_(IModelPropertyAccessor, IUnknown)
{
    STDMETHOD(GetValue)(_In_ PCWSTR key, _In_opt_ IModelObject* contextObject, _COM_Outptr_ IModelObject** value) PURE;
    STDMETHOD(SetValue)(_In_ PCWSTR key, _In_opt_ IModelObject* contextObject, _In_ IModelObject* value) PURE; 
}

GetValue

GetValue 方法是屬性存取子的 getter。 每當用戶端想要擷取 屬性的基礎值時,就會呼叫它。 請注意,任何直接取得屬性存取子的呼叫端,都會負責將索引鍵名稱和精確的實例物件(此指標)傳遞至屬性存取子的 GetValue 方法。

SetValue

SetValue 方法是屬性存取子的 setter。 每當用戶端想要將值指派給基礎屬性時,就會呼叫它。 許多屬性都是唯讀的。 在這種情況下,呼叫 SetValue 方法會傳回E_NOTIMPL。 請注意,任何直接取得屬性存取子的呼叫端,都會負責將索引鍵名稱和精確的實例物件(此指標)傳遞至屬性存取子的 SetValue 方法。

方法: IModelMethod

數據模型中的方法是IModelMethod 介面的實作,該介面會 Boxed 到 IModelObject。 查詢時,模型對象會傳回一種 ObjectMethod,而內建值是保證可查詢 IModelMethod 的VT_UNKNOWN。 在此程式中,它保證可靜態轉換成IModelMethod。 數據模型中的所有方法本質上都是動態的。 它們接受一組 0 或多個自變數的輸入,並傳回單一輸出值。 沒有多載解析,也沒有參數名稱、類型或預期的相關元數據。

IModelMethod 介面的定義如下:

DECLARE_INTERFACE_(IModelMethod, IUnknown)
{
    STDMETHOD(Call)(_In_opt_ IModelObject *pContextObject, _In_ ULONG64 argCount, _In_reads_(argCount) IModelObject **ppArguments, _COM_Errorptr_ IModelObject **ppResult, _COM_Outptr_opt_result_maybenull_ IKeyStore **ppMetadata) PURE;
}

呼叫

Call 方法是叫用數據模型中任何方法的方法。 呼叫端負責傳遞精確的實例物件(此指標)和任意的自變數集。 傳回方法的結果和與該結果相關聯的任何選擇性元數據。 不以邏輯方式傳回值的方法仍必須傳回有效的IModelObject。 在這種情況下,IModelObject 是 Boxed no 值。 如果方法失敗,它可能會傳回輸入自變數中的選擇性擴充錯誤資訊(即使傳回的 HRESULT 失敗也一樣)。 呼叫端必須檢查此專案。

索引鍵參考: IModelKeyReference 或 IModelKeyReference2

索引鍵參考基本上是特定物件上索引鍵的句柄。 用戶端可以透過 GetKeyReference 等方法擷取這類句柄,並在稍後使用句柄來取得或設定索引鍵的值,而不一定會保存原始物件。 這種類型的對像是IModelKeyReference 或IModelKeyReference2 介面的實作,該介面會Boxed到IModelObject。 查詢時,模型對象會傳回一種 ObjectKeyReference,然後內建值是保證可查詢 IModelKeyReference 的VT_UNKNOWN。 在此程式中,它保證可靜態轉換成 IModelKeyReference。

索引鍵參考介面的定義如下:

DECLARE_INTERFACE_(IModelKeyReference2, IModelKeyReference)
{
    STDMETHOD(GetKeyName)(_Out_ BSTR* keyName) PURE;
    STDMETHOD(GetOriginalObject)(_COM_Outptr_ IModelObject** originalObject) PURE;
    STDMETHOD(GetContextObject)(_COM_Outptr_ IModelObject** containingObject) PURE;
    STDMETHOD(GetKey)(_COM_Errorptr_opt_ IModelObject** object, _COM_Outptr_opt_result_maybenull_ IKeyStore** metadata) PURE;
    STDMETHOD(GetKeyValue)(_COM_Errorptr_opt_ IModelObject** object, _COM_Outptr_opt_result_maybenull_ IKeyStore** metadata) PURE;
    STDMETHOD(SetKey)(_In_opt_ IModelObject* object, _In_opt_ IKeyStore* metadata) PURE;
    STDMETHOD(SetKeyValue)(_In_ IModelObject* object) PURE;
    STDMETHOD(OverrideContextObject)(_In_ IModelObject* newContextObject) PURE;
}

GetKeyName

GetKeyName 方法會傳回此索引鍵參考為句柄的索引鍵名稱。 傳回的字串是標準的 BSTR,而且必須透過對 SysFreeString 的呼叫釋放。

GetOriginalObject

GetOriginalObject 方法會傳回建立索引鍵參考的實例物件。 請注意,索引鍵本身可能位於實例物件的父模型上。

GetContextObject

如果有問題的索引鍵參考屬性存取子,GetContextObject 方法會傳回內容 (此指標)會傳遞至屬性存取子的 GetValue 或 SetValue 方法。 這裡傳回的內容物件可能與從 GetOriginalObject 擷取的原始物件相同。 如果索引鍵位於父模型上,而且有與該父模型相關聯的內容調整器,原始物件就是呼叫 GetKeyReference 或 EnumerateKeyReferences 的實例物件。 內容物件會是原始物件與父模型之間最後一個內容調整器中傳出的任何內容,其中包含此索引鍵參考為句柄的索引鍵。 如果沒有內容調整器,則原始對象和內容物件完全相同。

GetKey

索引鍵參考上的 GetKey 方法會如同 IModelObject 上的 GetKey 方法一樣。 它會傳回基礎索引鍵的值,以及與索引鍵相關聯的任何元數據。 如果索引鍵的值恰好是屬性存取子,這會將屬性存取子 (IModelPropertyAccessor) 方塊化為 IModelObject。 這個方法不會在屬性存取子上呼叫基礎 GetValue 或 SetValue 方法。

GetKeyValue

索引鍵參考上的 GetKeyValue 方法會像 IModelObject 上的 GetKeyValue 方法一樣運作。 它會傳回基礎索引鍵的值,以及與索引鍵相關聯的任何元數據。 如果索引鍵的值恰好是屬性存取子,這會自動在屬性存取子上呼叫基礎 GetValue 方法。

SetKey

索引鍵參考上的 SetKey 方法會像 IModelObject 上的 SetKey 方法一樣運作。 它會指派索引鍵的值。 如果原始索引鍵是屬性存取子,這會取代屬性存取子。 它不會在屬性存取子上呼叫 SetValue 方法。

SetKeyValue

索引鍵參考上的 SetKeyValue 方法會像 IModelObject 上的 SetKeyValue 方法一樣運作。 它會指派索引鍵的值。 如果原始索引鍵是屬性存取子,這會在屬性存取子上呼叫基礎 SetValue 方法,而不是取代屬性存取子本身。

OverrideContextObject

OverrideContextObject 方法(僅存在於 IModelKeyReference2 上)是進階方法,用來永久改變這個索引鍵參考將傳遞給任何基礎屬性存取子的 GetValue 或 SetValue 方法的內容物件。 傳遞至這個方法的物件也會從 GetContextObject 的呼叫傳回。 腳本提供者可以使用此方法來復寫特定動態語言行為。 大部分的客戶端不應該呼叫此方法。

內容物件: IDebugHostContext

內容物件是不透明的資訊 Blob,偵錯主機(與數據模型合作)與每個對象相關聯。 它可能包含資訊來自的處理程式內容或位址空間等專案...內容對像是IModelObject內 Boxed 的 IDebugHostContext 實作。 請注意,IDebugHostContext 是主機定義的介面。 用戶端永遠不會實作這個介面。

如需內容對象的詳細資訊,請參閱 調試程序數據模型 C++ 介面中的調試程序數據模型 C++ 主機介面

數據模型管理員

數據模型管理員 IDataModelManager2 的核心介面(或先前的 IDataModelManager)定義如下:

DECLARE_INTERFACE_(IDataModelManager2, IDataModelManager)
{
    //
    // IDataModelManager:
    //
    STDMETHOD(Close)() PURE;
    STDMETHOD(CreateNoValue)(_Out_ IModelObject** object) PURE;
    STDMETHOD(CreateErrorObject)(_In_ HRESULT hrError, _In_opt_ PCWSTR pwszMessage, _COM_Outptr_ IModelObject** object) PURE;
    STDMETHOD(CreateTypedObject)(_In_opt_ IDebugHostContext* context, _In_ Location objectLocation, _In_ IDebugHostType* objectType, _COM_Errorptr_ IModelObject** object) PURE;
    STDMETHOD(CreateTypedObjectReference)(_In_opt_ IDebugHostContext* context, _In_ Location objectLocation, _In_ IDebugHostType* objectType, _COM_Errorptr_ IModelObject** object) PURE;
    STDMETHOD(CreateSyntheticObject)(_In_opt_ IDebugHostContext* context, _COM_Outptr_ IModelObject** object) PURE;
    STDMETHOD(CreateDataModelObject)(_In_ IDataModelConcept* dataModel, _COM_Outptr_ IModelObject** object) PURE;
    STDMETHOD(CreateIntrinsicObject)(_In_ ModelObjectKind objectKind, _In_ VARIANT* intrinsicData, _COM_Outptr_ IModelObject** object) PURE;
    STDMETHOD(CreateTypedIntrinsicObject)(_In_ VARIANT* intrinsicData, _In_ IDebugHostType* type, _COM_Outptr_ IModelObject** object) PURE;
    STDMETHOD(GetModelForTypeSignature)(_In_ IDebugHostTypeSignature* typeSignature, _Out_ IModelObject** dataModel) PURE;
    STDMETHOD(GetModelForType)(_In_ IDebugHostType* type, _COM_Outptr_ IModelObject** dataModel, _COM_Outptr_opt_ IDebugHostTypeSignature** typeSignature, _COM_Outptr_opt_ IDebugHostSymbolEnumerator** wildcardMatches) PURE;
    STDMETHOD(RegisterModelForTypeSignature)(_In_ IDebugHostTypeSignature* typeSignature, _In_ IModelObject* dataModel) PURE;
    STDMETHOD(UnregisterModelForTypeSignature)(_In_ IModelObject* dataModel, _In_opt_ IDebugHostTypeSignature* typeSignature) PURE;
    STDMETHOD(RegisterExtensionForTypeSignature)(_In_ IDebugHostTypeSignature* typeSignature, _In_ IModelObject* dataModel) PURE;
    STDMETHOD(UnregisterExtensionForTypeSignature)(_In_ IModelObject* dataModel, _In_opt_ IDebugHostTypeSignature* typeSignature) PURE;
    STDMETHOD(CreateMetadataStore)(_In_opt_ IKeyStore* parentStore, _COM_Outptr_ IKeyStore** metadataStore) PURE;
    STDMETHOD(GetRootNamespace)(_COM_Outptr_ IModelObject** rootNamespace) PURE;
    STDMETHOD(RegisterNamedModel)(_In_ PCWSTR modelName, _In_ IModelObject *modeObject) PURE;
    STDMETHOD(UnregisterNamedModel)(_In_ PCWSTR modelName) PURE;
    STDMETHOD(AcquireNamedModel)(_In_ PCWSTR modelName, _COM_Outptr_ IModelObject **modelObject) PURE;
    //
    // IDataModelManager2:
    //
    STDMETHOD(AcquireSubNamespace)(_In_ PCWSTR modelName, _In_ PCWSTR subNamespaceModelName, _In_ PCWSTR accessName, _In_opt_ IKeyStore *metadata, _COM_Outptr_ IModelObject **namespaceModelObject) PURE;
    STDMETHOD(CreateTypedIntrinsicObjectEx)(_In_opt_ IDebugHostContext* context, _In_ VARIANT* intrinsicData, _In_ IDebugHostType* type, _COM_Outptr_ IModelObject** object) PURE;
}

管理方法

裝載數據模型的應用程式會利用下列一組方法(例如調試程式)。

STDMETHOD(Close)() PURE;

關閉

裝載數據模型的應用程式在數據模型管理員上呼叫 Close 方法,以便啟動數據模型管理員的關機程式。 在數據模型管理員上釋放其最終參考之前,沒有 Close 方法的數據模型主機可能會導致未定義的行為,包括數據模型管理基礎結構的重大外洩。

物件建立/Boxing 方法

下列一組方法可用來建立新的物件,或將值 Box 值轉換成 IModelObject -- 數據模型的核心介面。

STDMETHOD(CreateNoValue)(_Out_ IModelObject** object) PURE;
STDMETHOD(CreateErrorObject)(_In_ HRESULT hrError, _In_opt_ PCWSTR pwszMessage, _COM_Outptr_ IModelObject** object) PURE;
STDMETHOD(CreateTypedObject)(_In_opt_ IDebugHostContext* context, _In_ Location objectLocation, _In_ IDebugHostType* objectType, _COM_Errorptr_ IModelObject** object) PURE;
STDMETHOD(CreateTypedObjectReference)(_In_opt_ IDebugHostContext* context, _In_ Location objectLocation, _In_ IDebugHostType* objectType, _COM_Errorptr_ IModelObject** object) PURE;
STDMETHOD(CreateSyntheticObject)(_In_opt_ IDebugHostContext* context, _COM_Outptr_ IModelObject** object) PURE;
STDMETHOD(CreateDataModelObject)(_In_ IDataModelConcept* dataModel, _COM_Outptr_ IModelObject** object) PURE;
STDMETHOD(CreateIntrinsicObject)(_In_ ModelObjectKind objectKind, _In_ VARIANT* intrinsicData, _COM_Outptr_ IModelObject** object) PURE;
STDMETHOD(CreateTypedIntrinsicObject)(_In_ VARIANT* intrinsicData, _In_ IDebugHostType* type, _COM_Outptr_ IModelObject** object) PURE;
STDMETHOD(CreateMetadataStore)(_In_opt_ IKeyStore* parentStore, _COM_Outptr_ IKeyStore** metadataStore) PURE;
STDMETHOD(CreateTypedIntrinsicObjectEx)(_In_opt_ IDebugHostContext* context, _In_ VARIANT* intrinsicData, _In_ IDebugHostType* type, _COM_Outptr_ IModelObject** object) PURE;

CreateNoValue

CreateNoValue 方法會建立「無值」物件、將它箱到IModelObject 中,並傳回它。 傳回的模型物件有一種 ObjectNoValue。

“no value” 物件具有數個語意意義:

  • (視語言而定),它可以視為 void、null 或 undefined 的語意對等專案
  • 任何傳回成功的屬性存取子的 GetValue 方法,以及產生的「無值」物件,都表示特定實例的特定屬性沒有值,而且應該被視為該特定實例的屬性不存在。
  • 沒有語意上沒有傳回值的數據模型方法會使用此值作為 sentinel 來指出這類值(例如方法必須傳回有效的 IModelObject)。

CreateErrorObject

CreateErrorObject 方法會建立「錯誤物件」。 數據模型沒有例外狀況和例外狀況流程的概念。 失敗有兩種方式來自屬性/方法:

  • 單一失敗的 HRESULT,沒有延伸的錯誤資訊。 沒有其他資訊可以針對錯誤提供,或錯誤本身是從傳回的 HRESULT 自我解釋。
  • 單一失敗的 HRESULT 加上擴充的錯誤資訊。 擴充錯誤資訊是在屬性/方法的輸出自變數中傳回的錯誤物件。

CreateTypedObject

CreateTypedObject 方法是方法,可讓用戶端在偵錯目標的地址空間中建立原生/語言物件的表示法。 如果新建立的物件類型(如 objectType 自變數所指示)恰好符合一或多個向數據模型管理員註冊的類型簽章,作為標準可視化檢視或延伸模組,這些相符的數據模型就會在傳回呼叫端之前自動附加至已建立的實例物件。

CreateTypedObjectReference

CreateTypedObjectReference 方法語意類似 CreateTypedObject 方法,不同之處在於它會建立基礎原生/語言建構的參考。 建立的參考是物件,其具有一種 ObjectTargetObjectReference。 它不是原生參考,因為基礎語言可能支援(例如:C++ 和 或 &&&)。 C++ 參考完全可以有 ObjectTargetObjectReference。 ObjectTargetObjectReference 類型的物件可以透過在 IModelObject 上使用 Dereference 方法,轉換為基礎值。 參考也可以傳遞至基礎主機的表達式評估工具,以便以適當的語言指派回值。

CreateSyntheticObject

CreateSyntheticObject 方法會建立空的數據模型物件 -- 索引鍵/值/元數據元組和概念的字典。 在建立時,對象上沒有索引鍵和概念。 這是呼叫端所要利用的全新石板。

CreateDataModelObject

CreateDataModelObject 方法是簡單的協助程式包裝函式,用來建立屬於數據模型的物件,也就是要附加為其他物件的父模型的物件。 所有這類對象都必須透過 IDataModelConcept 支援數據模型概念。 此方法會建立沒有明確內容的新空白綜合物件,並將 inpassed IDataModelConcept 新增為新建立之對象的數據模型概念實作。 這同樣可以透過呼叫 CreateSyntheticObject 和 SetConcept 來完成。

CreateIntrinsicObject

CreateIntrinsicObject 方法是將內建值框入 IModelObject 的方法。 呼叫端會將值放在 COM VARIANT 中,並呼叫這個方法。 數據模型管理員會傳回代表 物件的IModelObject。 請注意,這個方法也可用來方塊基本 IUnknown 型別:屬性存取子、方法、內容等等...在這種情況下,objectKind 方法會指出物件所代表的IUnknown型建構類型,而傳遞之變體的 punkVal 字段是 IUnknown 衍生類型。 類型必須靜態轉換成適當的模型介面(例如:IModelPropertyAccessor、IModelMethod、IDebugHostContext 等...)。 此方法支援的 VARIANT 類型為 VT_UI1、VT_I1、VT_UI2、VT_I2、VT_UI4、VT_I4、VT_UI8、VT_I8、VT_R4、VT_R8、VT_BOOL、VT_BSTR 和 VT_UNKNOWN (適用於列舉 ModelObjectKind 所指示的特殊 IUnknown 衍生型別集。

CreateTypedIntrinsicObject

CreateTypedintrinsicObject 方法類似於 CreateIntrinsicObject 方法,不同之處在於它允許原生/語言類型與數據相關聯,並連同 Boxed 值一起攜帶。 這可讓數據模型代表像是原生列舉型別的建構(這隻是VT_UI* 或VT_I* 值)。 指標類型也會使用這個方法建立。 數據模型中的原生指標是零個延伸的64位數量,代表位移到偵錯目標的虛擬位址空間。 它會在VT_UI8內方塊化,並使用此方法和表示原生/語言指標的類型來建立。

CreateMetadataStore

CreateMetadataStore 方法會建立金鑰存放區 -- 金鑰/值/元數據元組的簡化容器 -- 用來保存可與屬性和各種其他值相關聯的元數據。 元數據存放區可能有單一父代(接著可以有單一父代)。 如果指定的元數據索引鍵不在指定的存放區中,則會檢查其父系。 大部分的元數據存放區沒有父代。 不過,它確實提供輕鬆共用一般元數據的方式。

CreateTypedIntrinsicObjectEx

CreateTypedIntrinsicObjectEx 方法在語意上類似於 CreateTypedIntrinsicObject 方法。 這兩者的唯一差異在於此方法可讓呼叫端指定內部數據有效的內容。 如果未傳遞任何內容,則數據在繼承自 type 自變數的任何內容中都會被視為有效(CreateTypedIntrinsicObject 的行為方式)。 這允許在偵錯目標中建立具型別指標值,其需要比繼承自類型更特定的內容。

擴充性/註冊方法:下列一組方法 會管理數據模型的擴充性機制,讓用戶端擴充或註冊現有的模型,或要求數據模型在符合指定準則的原生類型上自動附加指定的父模型。

    STDMETHOD(GetModelForTypeSignature)(_In_ IDebugHostTypeSignature* typeSignature, _Out_ IModelObject** dataModel) PURE;
    STDMETHOD(GetModelForType)(_In_ IDebugHostType* type, _COM_Outptr_ IModelObject** dataModel, _COM_Outptr_opt_ IDebugHostTypeSignature** typeSignature, _COM_Outptr_opt_ IDebugHostSymbolEnumerator** wildcardMatches) PURE;
    STDMETHOD(RegisterModelForTypeSignature)(_In_ IDebugHostTypeSignature* typeSignature, _In_ IModelObject* dataModel) PURE;
    STDMETHOD(UnregisterModelForTypeSignature)(_In_ IModelObject* dataModel, _In_opt_ IDebugHostTypeSignature* typeSignature) PURE;
    STDMETHOD(RegisterExtensionForTypeSignature)(_In_ IDebugHostTypeSignature* typeSignature, _In_ IModelObject* dataModel) PURE;
    STDMETHOD(UnregisterExtensionForTypeSignature)(_In_ IModelObject* dataModel, _In_opt_ IDebugHostTypeSignature* typeSignature) PURE;
    STDMETHOD(GetRootNamespace)(_COM_Outptr_ IModelObject** rootNamespace) PURE;
    STDMETHOD(RegisterNamedModel)(_In_ PCWSTR modelName, _In_ IModelObject *modeObject) PURE;
    STDMETHOD(UnregisterNamedModel)(_In_ PCWSTR modelName) PURE;
    STDMETHOD(AcquireNamedModel)(_In_ PCWSTR modelName, _COM_Outptr_ IModelObject **modelObject) PURE;

GetModelForTypeSignature

GetModelForTypeSignature 方法會透過對 RegisterModelForTypeSignature 方法的先前呼叫,傳回針對特定類型簽章註冊的數據模型。 從這個方法傳回的數據模型會被視為任何符合所傳遞類型簽章之類型的標準可視化檢視。 作為標準可視化檢視,該數據模型會接管類型的顯示。 根據預設,顯示引擎會隱藏物件的原生/語言建構,有利於數據模型所呈現之對象的檢視。

GetModelForType

GetModelForType 方法會傳回數據模型,這是指定類型實例的正式可視化檢視。 實際上,此方法會尋找與 RegisterModelForTypeSignature 方法先前呼叫註冊的最佳相符類型簽章,並傳回相關聯的數據模型。

RegisterModelForTypeSignature

RegisterModelForTypeSignature 方法是呼叫端用來為指定類型(或一組類型)註冊標準可視化檢視的主要方法。 標準可視化檢視是數據模型,實際上會接管指定類型的顯示(或一組類型)。 除了顯示在任何調試程式使用者介面中之類型的原生/語言檢視之外,則會顯示已註冊數據模型所呈現之類型的檢視(以及可取回原生/語言檢視的方法)。

UnregisterModelForTypeSignature

UnregisterModelForTypeSignature 方法會復原 RegisterModelForTypeSignature 方法的先前呼叫。 這個方法可以將指定的數據模型移除為符合特定類型簽章之型別的正式可視化檢視,也可以移除指定數據模型做為註冊該數據模型之每個類型簽章的正式可視化檢視。

RegisterExtensionForTypeSignature

RegisterExtensionForTypeSignature 方法類似於 RegisterModelForTypeSignature 方法,但有一個主要差異。 傳遞給這個方法的數據模型不是任何類型的標準可視化檢視,而且不會接管該類型的原生/語言檢視的顯示。 傳遞至這個方法的數據模型會自動新增為任何符合所提供類型簽章之具體型別的父代。 與 RegisterModelForTypeSignature 方法不同,在將相同或模棱兩可的類型簽章註冊為指定型別的延伸模組時沒有限制(或一組型別)。 每個類型簽章符合指定具體類型實例的延伸模組,都會讓透過這個方法註冊的數據模型自動附加至新建立的物件做為父模型。 實際上,這可讓任意數目的用戶端使用新的欄位或功能來擴充類型(或一組類型)。

UnregisterExtensionForTypeSignature

UnregisterExtensionForTypeSignature 方法會復原 RegisterExtensionForTypeSignature 的先前呼叫。 它會將特定數據模型取消註冊為特定類型簽章的延伸模組,或作為註冊數據模型之所有類型簽章的延伸模組。

GetRootNamespace

GetRootNamespace 方法會傳回數據模型的根命名空間。 這是數據模型管理和偵錯主機放置特定對象的物件。

RegisterNamedModel

RegisterNamedModel 方法會以已知的名稱註冊指定的數據模型,以便讓想要擴充它的用戶端找到它。 這是 API 的主要用途-- 將數據模型發佈為可擴充的專案,方法是擷取在此已知名稱下註冊的模型,並將父模型加入其中。

UnregisterNamedModel

UnregisterNamedModel 方法會復原 RegisterNamedModel 的先前呼叫。 它會移除數據模型與可查閱其名稱之間的關聯。

AcquireNamedModel

想要擴充以指定名稱註冊之數據模型的呼叫端會呼叫 AcquireNamedModel 方法,以便擷取想要擴充之數據模型的物件。 這個方法會傳回任何透過 RegisterNamedModel 方法先前呼叫註冊的數據模型。 由於 AcquireNamedModel 方法的主要用途是擴充模型,如果尚未在指定名稱下註冊任何模型,這個方法就會有特殊行為。 如果尚未在指定名稱下註冊模型,則會建立存根對象、暫時在指定名稱下註冊,並傳回給呼叫端。 透過對 RegisterNamedModel 方法的呼叫來註冊實際數據模型時,對存根物件所做的任何變更實際上都是對實際模型所做的。 這會從彼此延伸的元件中移除許多載入順序相依性問題。

協助程式方法

下列方法是一般協助程式方法,可協助對數據模型中的物件執行複雜的作業。 雖然可以透過數據模型或其物件上的其他方法執行這些動作,但這些便利方法可大幅簡化:

STDMETHOD(AcquireSubNamespace)(_In_ PCWSTR modelName, _In_ PCWSTR subNamespaceModelName, _In_ PCWSTR accessName, _In_opt_ IKeyStore *metadata, _COM_Outptr_ IModelObject **namespaceModelObject) PURE;

AcquireSubNamespace

AcquireSubNamespace 方法有助於建構比動態語言中新物件更傳統的語言命名空間。 例如,如果呼叫端想要將進程物件上的屬性分類,讓進程物件更容易組織,而且屬性更容易探索,則執行此動作的其中一種方法就是為進程物件上的每個類別建立子物件,並將這些屬性放在該物件內。

另請參閱

本主題是一系列的一部分,描述可從 C++ 存取的介面、如何使用它們來建置以 C++ 為基礎的調試程式延伸模組,以及如何從 C++ 數據模型延伸模組使用其他數據模型建構(例如:JavaScript 或 NatVis)。

調試程序數據模型 C++ 概觀

調試程序數據模型 C++ 介面

調試程序數據模型 C++ 其他介面

調試程序數據模型 C++ 概念

調試程序數據模型 C++ 腳本