Método IDebugHostSymbols::CreateTypeSignature (dbgmodel.h)
El método CreateTypeSignature crea una firma que se puede usar para buscar coincidencias con un conjunto de tipos concretos mediante el uso de un módulo y un nombre de tipo. El formato de la cadena de firma de nombre de tipo es específico del lenguaje que se está depurando (y del host de depuración). Para C/C++, la cadena de firma es equivalente a una especificación de tipo NatVis. Es decir, la cadena de firma es un nombre de tipo donde se permiten caracteres comodín (especificados como *) para argumentos de plantilla.
Sintaxis
HRESULT CreateTypeSignature(
PCWSTR signatureSpecification,
IDebugHostModule *module,
IDebugHostTypeSignature **typeSignature
);
Parámetros
signatureSpecification
Cadena de firma que identifica los tipos a los que se aplica esta firma. El formato de esta cadena es específico del lenguaje que se está depurando. Para C/C++, esto equivale a una especificación de tipo NatVis. Este es un nombre de tipo donde se permiten caracteres comodín para los argumentos de plantilla (especificados como *).
module
Si se especifica, solo los tipos contenidos en el módulo especificado coinciden con la firma. Si no se especifica, los tipos de cualquier módulo pueden coincidir potencialmente con la firma.
typeSignature
Aquí se devuelve el objeto de firma de tipo creado.
Valor devuelto
Este método devuelve HRESULT que indica éxito o error.
Comentarios
Código de ejemplo
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.
}
}
}
Diferencias en la coincidencia de módulos de símbolos en FindModuleByName, CreateTypeSignature y CreateTypeSignatureForModuleRange
FindModuleByName permitirá que el nombre del módulo pasado sea el nombre de imagen real del módulo, por ejemplo, Mi Module.dll o el que puede hacer referencia a él en el motor del depurador (por ejemplo: MyModule o MyModule_<hex_base>).
Al llamar a CreateTypeSignatureForModuleRange y pasar un nombre,nullptr/nullptr/nullptr, se creará una firma que coincidirá con cualquier módulo que coincida con ese nombre de cualquier versión.
El nombre del módulo pasado a las funciones CreateTypeSignature solo aceptará el nombre de imagen real del módulo (por ejemplo, MyModule.dll).
Al llamar a FindModuleByName y, a continuación, CreateTypeSignature con ese módulo se creará una firma que coincidirá solo con la instancia concreta del módulo que se le ha pasado. Si hay dos copias de un módulo que se carga (por ejemplo, ntdll en un proceso de 32 bits que se ejecuta en Windows de 64 bits), solo coincidiría con la instancia específica pasada. Tampoco coincidiría si ese archivo DLL se descargara y se volvera a cargar. La firma está asociada a una instancia específica de un módulo, como lo conoce el depurador.
Requisitos
Requisito | Valor |
---|---|
Header | dbgmodel.h |