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


Метод 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