Compartir a través de


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

Consulte también

Interfaz IDebugHostSymbols

FindModuleByName

CreateTypeSignatureForModuleRange