Freigeben über


IDataModelConcept::InitializeObject-Methode (dbgmodel.h)

Ein Datenmodell kann als kanonische Schnellansicht oder als Erweiterung für einen bestimmten nativen Typ über die RegisterModelForTypeSignature- oder RegisterExtensionForTypeSignature-Methoden des Datenmodell-Managers registriert werden. Wenn ein Modell über eine dieser Methoden registriert wird, wird das Datenmodell automatisch als übergeordnetes Modell an jedes native Objekt angefügt, dessen Typ mit der in der Registrierung übergebenen Signatur übereinstimmt. An dem Punkt, an dem diese Anlage automatisch erstellt wird, wird die InitializeObject-Methode für das Datenmodell aufgerufen. Es wird das instance-Objekt, die Typsignatur, die die Anlage verursacht hat, und ein Enumerator übergeben, der die Typinstanzen (in linearer Reihenfolge) erzeugt, die mit allen Feldhaltern in der Typsignatur übereinstimmen. Die Datenmodellimplementierung kann diesen Methodenaufruf verwenden, um alle benötigten Caches zu initialisieren.

Syntax

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

Parameter

modelObject

Das instance Objekt, das initialisiert wird.

matchingTypeSignature

Die Typsignatur, mit der der systemeigene Typ von modelObject übereinstimmt, der die Anlage des Datenmodells verursacht hat.

wildcardMatches

Wenn die übereinstimmende Typsignatur Feldhalter enthält, enthält dieses Argument einen Enumerator, der aufzählt, wie die einzelnen Feldhalter übereinstimmen. In der Regel ist jedes hier aufgelistete IDebugHostSymbol ein IDebugHostType. Das ist jedoch keine Anforderung. Nicht typisierte Vorlagenargumente können (unter anderem) Platzhaltern entsprechen und Symbole wie IDebugHostConstant erzeugen.

Rückgabewert

Diese Methode gibt HRESULT zurück, das auf Erfolg oder Fehler hinweist. Wenn diese Methode nicht auftritt, wird die Objektkonstruktion der instance verhindert.

Hinweise

Beachten Sie, dass eine bestimmte Datenmodellimplementierung nicht davon ausgehen kann, dass der InitializeObject-Aufruf für jedes Objekt ausgeführt wird, an das das Datenmodell angefügt ist. Da es sich beim Datenmodell um ein vollständig dynamisches System handelt, ist es für einen Aufrufer durchaus möglich, ein Modell direkt abzurufen (z. B. über die GetParentModel-Methode auf IModelObject) und es manuell anzufügen. In einem solchen Fall ist der InitializeObject-Aufruf nicht erfolgt, und die Implementierung muss bereit sein, dies zu tun. Das Aufrufen dieser Methode ist eine Optimierung, damit teure Implementierungen erforderliche Caches vorab ausfüllen und initialisieren können.

Implementierungsbeispiel

Beachten Sie, dass ein Client diese Schnittstelle nie aufruft.

//
// 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;
}

Anforderungen

Anforderung Wert
Header dbgmodel.h

Weitere Informationen

IDataModelConcept-Schnittstelle