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 |