Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Метод 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 |