次の方法で共有


IDataModelConcept::InitializeObject メソッド (dbgmodel.h)

データ モデルは、正規ビジュアライザーとして、またはデータ モデル マネージャーの RegisterModelForTypeSignature メソッドまたは RegisterExtensionForTypeSignature メソッドを使用して、特定のネイティブ型の拡張機能として登録できます。 これらのいずれかのメソッドを使用してモデルを登録すると、データ モデルは、登録で渡されたシグネチャと一致する型を持つネイティブ オブジェクトに親モデルとして自動的にアタッチされます。 その添付ファイルが自動的に作成される時点で、InitializeObject メソッドがデータ モデルで呼び出されます。 インスタンス オブジェクト、添付ファイルの原因となった型シグネチャ、および型シグネチャ内のワイルドカードと一致する型インスタンスを (線形順に) 生成する列挙子が渡されます。 データ モデルの実装では、このメソッド呼び出しを使用して、必要なキャッシュを初期化できます。

構文

HRESULT InitializeObject(
  IModelObject               *modelObject,
  IDebugHostTypeSignature    *matchingTypeSignature,
  IDebugHostSymbolEnumerator *wildcardMatches
);

パラメーター

modelObject

初期化中のインスタンス オブジェクト。

matchingTypeSignature

データ モデルの添付ファイルの原因となった modelObject のネイティブ型が一致した型シグネチャ。

wildcardMatches

一致する型シグネチャにワイルドカードが含まれている場合、この引数には列挙子が含まれます。この列挙子は、各ワイルドカードの一致方法を列挙します。 通常、ここで列挙される各 IDebugHostSymbolIDebugHostType です。 つまり、要件ではありません。 型以外のテンプレート引数 (特に) はワイルドカードと一致する可能性があり、 IDebugHostConstant などのシンボルが生成される場合があります。

戻り値

このメソッドは、成功または失敗を示す HRESULT を返します。 このメソッドを失敗すると、インスタンスのオブジェクトの構築が妨けられます。

注釈

特定のデータ モデルの実装では、データ モデルがアタッチされているすべてのオブジェクトに対して InitializeObject 呼び出しが行われるとは想定できないことに注意してください。 データ モデルは完全に動的なシステムであるため、呼び出し元がモデルを直接取得し ( たとえば、IModelObject の GetParentModel メソッドを使用して) 手動でアタッチすることは完全に可能です。 このような状況では、InitializeObject 呼び出しは行われず、実装を準備する必要があります。 このメソッドの呼び出しは、コストの高い実装で必要なキャッシュを事前に入力して事前初期化できるようにするための最適化です。

実装例

クライアントはこのインターフェイスを呼び出さないことに注意してください。

//
// InitializeObject is an implementation of the interface method on some 
// class representing a data model.  Consider that the class has a GetObject() method
// which returns the IModelObject for the data model
//
// Let's also imagine that this registered for the type signature "std::vector<*>"
//
IFACEMETHOD(InitializeObject)(_In_ IModelObject *pContextObject, _In_ IDebugHostTypeSignature *pTypeSignature, _In_ IDebugHostSymbolEnumerator *pWildcardMatches)
{
    HRESULT hr = S_OK;

    // The minimal implementation is "return S_OK;"
    // Typically, this is used to fill cache information.  Imagine we have a 
    // cache in the context data.
    ComPtr<IUnknown> spCtxData;
    hr = pContextObject->GetContextForDataModel(GetObject(), &spCtxData));
    if (SUCCEEDED(hr))
    {
        CacheData *pCacheData = static_cast<CacheData *>(spCtxData.Get());

        // Find the instance type.  This is the template argument(s) which 
        // matched the * in 'std::vector<*>'
        ComPtr<IDebugHostSymbol> spFirstMatch;
        hr = pWildcardMatches->GetNext(&spFirstMatch));
        if (SUCCEEDED(hr))
        {
            SymnbolKind sk;
            ComPtr<IDebugHostType> spFirstType;
            if (SUCCEEDED(hr = spFirstMatch->GetSymbolKind(&sk)) && sk == SymbolType &&
                SUCCEEDED(hr = spFirstMatch.As(&spFirstType))))
            {
                pCacheData->SetInstanceType(spFirstType.Get()));
            }
        }
    }

    return hr;
}

要件

要件
Header dbgmodel.h

こちらもご覧ください

IDataModelConcept インターフェイス