Freigeben über


IDebugHostSymbols::CreateTypeSignature-Methode (dbgmodel.h)

Die CreateTypeSignature-Methode erstellt eine Signatur, die verwendet werden kann, um eine Reihe von konkreten Typen abzugleichen, indem sie Modul und Typnamen enthält. Das Format der Typnamensignaturzeichenfolge ist spezifisch für die Zu debuggende Sprache (und den Debughost). Für C/C++ entspricht die Signaturzeichenfolge einer NatVis-Typspezifikation. Das heißt, die Signaturzeichenfolge ist ein Typname, bei dem Platzhalter (als *angegeben) für Vorlagenargumente zulässig sind.

Syntax

HRESULT CreateTypeSignature(
  PCWSTR                  signatureSpecification,
  IDebugHostModule        *module,
  IDebugHostTypeSignature **typeSignature
);

Parameter

signatureSpecification

Die Signaturzeichenfolge, die die Typen identifiziert, für die diese Signatur gilt. Das Format dieser Zeichenfolge ist spezifisch für die Zu debuggende Sprache. Für C/C++ entspricht dies einer NatVis-Typspezifikation. Dies ist ein Typname, bei dem Platzhalter für Vorlagenargumente zulässig sind (als *angegeben).

module

Wenn angegeben, entsprechen nur Typen, die im angegebenen Modul enthalten sind, der Signatur. Wenn nicht angegeben, können Typen in einem beliebigen Modul möglicherweise mit der Signatur übereinstimmen.

typeSignature

Das erstellte Typsignaturobjekt wird hier zurückgegeben.

Rückgabewert

Diese Methode gibt HRESULT zurück, das auf Erfolg oder Fehler hinweist.

Hinweise

Beispielcode

ComPtr<IDebugHost> spHost; /* get the host */

ComPtr<IDebugHostSymbols> spSym;
if (SUCCEEDED(spHost.As(&spSym)))
{
    // Create a type signature for MyTemplateType<*>
    ComPtr<IDebugHostTypeSignature> spSig1;
    if (SUCCEEDED(spSym->CreateTypeSignature(L"MyTemplateType<*>", 
                                             nullptr, 
                                             &spSig1)))
    {
        // spSig1 is a type signature which will match any concrete template 
        // type with a base name of MyTemplateType and *ANY* template arguments.
        // This is true regardless of the module in which the type is contained.
    }

    ComPtr<IDebugHostModule> spMyModule;
    if (SUCCEEDED(spSym->FindModuleByName(USE_CURRENT_HOST_CONTEXT, 
                                          L"MyModule.dll", 
                                          &spMyModule)))
    {
        // Create a type signature for MyTemplateType<*> within MyModule.dll.
        ComPtr<IDebugHostTypeSignature> spSig2;
        if (SUCCEEDED(spSym->CreateTypeSignature(L"MyTemplateType<*>", 
                                                 nullptr, 
                                                 &spSig2)))
        {
            // spSig2 is a type signature which will match any concrete 
            // template type with a base name of MyTemplateType and *ANY* 
            // template arguments that is within the particular MyModule.dll 
            // that's in the current UI context (e.g.: process) of the debugger.
            // This means if the host is debugging multiple processes
            // and you switch processes, a MyTemplateType<*> in an identically
            // named and versioned MyModule.dll will *NOT* match this signature.
        }
    }
}

Unterschiede beim Abgleich von Symbolmodulen in FindModuleByName, CreateTypeSignature und CreateTypeSignatureForModuleRange

FindModuleByName ermöglicht es, dass der übergebene Modulname entweder der reale Imagename des Moduls ist, z. B. My Module.dll, oder der Name, auf den Sie in der Debugger-Engine verweisen können (z. B.: MyModule oder MyModule_<hex_base>).

Durch aufrufen von CreateTypeSignatureForModuleRange und Übergeben eines Namens/nullptr/nullptr wird eine Signatur erstellt, die mit jedem Modul übereinstimmt, das mit diesem Namen einer beliebigen Version übereinstimmt.

Der Modulname, der an die CreateTypeSignature-Funktionen übergeben wird, akzeptiert nur den tatsächlichen Bildnamen des Moduls (z. B. MyModule.dll).

Wenn Sie FindModuleByName und dann CreateTypeSignature mit diesem Modul aufrufen, wird eine Signatur erstellt, die nur mit dem bestimmten instance des moduls übereinstimmt, das an dieses Modul übergeben wird. Wenn zwei Kopien eines Moduls geladen werden (z. B. ntdll in einem 32-Bit-Prozess, der unter 64-Bit-Windows ausgeführt wird), entspricht es nur dem spezifischen instance, der übergeben wurde. Sie würde auch nicht mehr übereinstimmen, wenn diese DLL entladen und neu geladen würde. Die Signatur ist einer bestimmten instance eines Moduls zugeordnet, wie sie vom Debugger bekannt ist.

Anforderungen

Anforderung Wert
Header dbgmodel.h

Weitere Informationen

IDebugHostSymbols-Schnittstelle

FindModuleByName

CreateTypeSignatureForModuleRange