Поделиться через


Метод IDebugHostSymbols::CreateTypeSignature (dbgmodel.h)

Метод CreateTypeSignature создает сигнатуру, которую можно использовать для сопоставления набора конкретных типов, содержащих имя модуля и типа. Формат строки сигнатуры имени типа зависит от отлаживаемого языка (и узла отладки). Для C/C++ строка подписи эквивалентна спецификации типа NatVis. То есть строка подписи — это имя типа, в котором для аргументов шаблона разрешены подстановочные знаки (указанные как *).

Синтаксис

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

Параметры

signatureSpecification

Строка сигнатуры, которая определяет типы, к которым применяется эта подпись. Формат этой строки зависит от отлаживаемого языка. Для C/C++ это эквивалентно спецификации типа NatVis. Это имя типа, в котором подстановочные знаки разрешены для аргументов шаблона (указывается как *).

module

Если этот параметр указан, сигнатуре соответствуют только типы, содержащиеся в данном модуле. Если значение не указано, типы в любом модуле потенциально могут соответствовать сигнатуре.

typeSignature

Здесь возвращается созданный объект сигнатуры типа.

Возвращаемое значение

Этот метод возвращает HRESULT, который указывает на успех или сбой.

Комментарии

Образец кода

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.
        }
    }
}

Различия в сопоставлении модулей символов в FindModuleByName, CreateTypeSignature и CreateTypeSignatureForModuleRange

FindModuleByName позволяет использовать имя переданного модуля как реальное имя образа модуля, например My Module.dll, или имя, на которое можно ссылаться в обработчике отладчика (например, MyModule или MyModule_<hex_base>).

Вызов Метода CreateTypeSignatureForModuleRange и передача имени/nullptr/nullptr создаст сигнатуру, соответствующую любому модулю, соответствующему имени любой версии.

Имя модуля, переданное функциям CreateTypeSignature, будет принимать только имя реального образа модуля (например, MyModule.dll).

Вызов FindModuleByName и CreateTypeSignature с помощью этого модуля создаст сигнатуру, которая будет соответствовать только конкретному экземпляру модуля, переданного ему. Если загружены две копии модуля (например, ntdll в 32-разрядном процессе, работающем в 64-разрядной версии Windows), он будет соответствовать только конкретному переданном экземпляру. Она также больше не будет совпадать, если эта библиотека DLL была выгружена и перезагружена. Сигнатура связана с определенным экземпляром модуля, известного отладчиком.

Требования

Требование Значение
Заголовок dbgmodel.h

См. также раздел

Интерфейс IDebugHostSymbols

FindModuleByName

CreateTypeSignatureForModuleRange