IDataModelManager2::RegisterModelForTypeSignature-Methode (dbgmodel.h)

Die RegisterModelForTypeSignature-Methode ist die primäre Methode, die ein Aufrufer verwendet, um eine kanonische Schnellansicht für einen bestimmten Typ (oder satz von Typen) zu registrieren. Eine kanonische Schnellansicht ist ein Datenmodell, das die Anzeige eines bestimmten Typs (oder einer Gruppe von Typen) übernimmt. Anstelle der nativen/sprachlichen Ansicht des Typs, die in einer beliebigen Debugger-Benutzeroberfläche angezeigt wird, wird die Ansicht des Typs angezeigt, wie er vom registrierten Datenmodell dargestellt wird (zusammen mit einer Möglichkeit, die Native-/Sprachansicht für einen Benutzer, der dies wünscht, zurückzukehren). Die An diese Methode übergebene Typsignatur kann mit mehreren konkreten Typen übereinstimmen. Wenn mehrere Übereinstimmungen für einen bestimmten Typ instance vorhanden sind, wird nur die beste Übereinstimmung zurückgegeben. Eine Typsignatur wird als bessere Übereinstimmung betrachtet als eine andere, wenn sie sich genauer auf einen bestimmten konkreten Typ bezieht. Beispiele:

A) std::pair<*, *>
B) std::pair<int, *>
C) std::pair<int, float>

Wenn die drei oben genannten Typsignaturen (A, B und C) registriert und anhand eines konkreten Typs überprüft werden:

std::pair<int, float>

Alltype-Signaturen entsprechen diesem Typ instance. Die zweite ist eine bessere Übereinstimmung als die erste, da int (das erste Vorlagenargument von B) eine bessere Übereinstimmung als ein Platzhalter ist (das erste Vorlagenargument von A). Ebenso ist die dritte eine bessere Übereinstimmung als die zweite (es handelt sich um eine Gesamtbesprechung ohne Platzhalter). Die RegisterModelForTypeSignature-Methode lässt die Registrierung doppelter Typsignaturen nicht zu. Nur ein Datenmodell kann als kanonische Schnellansicht für eine bestimmte Typsignatur registriert werden. Ein Versuch, die gleiche Typsignatur zweimal zu registrieren, schlägt fehl. Ebenso lässt die RegisterModelForTypeSignature-Methode keine Typsignaturen zu, die mehrdeutig mit jedem Typ instance übereinstimmen können, zu registrieren. Beispiel:

D) std::pair<int, *>
E) std::pair<*, int>

Die beiden oben genannten Typsignaturen (D und E) können nicht beide registriert werden. Für einige Typen ist klar, welche Signatur zutrifft und am besten geeignet ist. Beispiel:

std::pair<int, float>

Entspricht nur der ersten dieser (D), da float und int nicht übereinstimmen. Es ist jedoch völlig mehrdeutig, wenn folgendes berücksichtigt wird:

std::pair<int, int>

Jede dieser Signaturen ist gleich gut (beide haben eine konkrete und eine Wildcard-Übereinstimmung). Diese Typsignaturen sind mehrdeutig. Daher schlägt ein Aufruf zur Registrierung der zweiten aus diesem Grund fehl.

Syntax

HRESULT RegisterModelForTypeSignature(
  IDebugHostTypeSignature *typeSignature,
  IModelObject            *dataModel
);

Parameter

typeSignature

Die Typsignatur, die registriert wird. Jedes native/sprachbasierte Objekt eines konkreten Typs, der dieser Typsignatur am besten entspricht, wird automatisch das vom argument dataModel angegebene Datenmodell angefügt.

dataModel

Das Datenmodell, das zur kanonischen Schnellansicht für Typen werden soll, die der angegebenen Typsignatur entsprechen.

Rückgabewert

Diese Methode gibt HRESULT zurück, das den Erfolg oder Fehler angibt. Diese Methode kann keine identischen oder mehrdeutigen Typsignaturen registrieren.

Hinweise

Beispielcode

ComPtr<IDataModelManager2> spManager; /* get the data model manager */
ComPtr<IDebugHost> spHost;           /* get the debug host */

ComPtr<IModelObject> spDataModel;    /* create a data model (see 
                                        CreateDataModelObject) */

ComPtr<IDebugHostSymbols> spSym;
if (SUCCEEDED(spHost.As(&spSym)))
{
    // Create a signature to match MyType<*>
    ComPtr<IDebugHostTypeSignature> spTypeSignature;
    if (SUCCEEDED(spSym->CreateTypeSignature(L"MyType<*>", 
                                             nullptr, 
                                             &spTypeSignature)))
    {
        // Register the model for std::vector<*>
        if (SUCCEEDED(spManager->RegisterModelForTypeSignature(spTypeSignature.Get(),
                                                               spDataModel.Get()))
        {
            // Every instance matching MyType<*> will now have spDataModel 
            // attached as the parent.  Further, such parent is considered 
            // the canonical visualizer for all types matching MyType<*> since 
            // it was registered via RegisterModelForTypeSignature instead of
            // RegisterExtensionForTypeSignature.
        }
    }
}

Anforderungen

Anforderung Wert
Header dbgmodel.h

Weitere Informationen

IDataModelManager2-Schnittstelle