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 并传递 name/nullptr 将创建一个签名,该签名将与任何版本的名称匹配的任何模块匹配。

传递给 CreateTypeSignature 函数的模块名称将仅接受模块的真实映像名称 (例如:MyModule.dll) 。

使用该模块调用 FindModuleByName ,然后调用 CreateTypeSignature 将创建仅与传递给它的模块的特定实例匹配的签名。 如果在 64 位 Windows) 上运行的 32 位进程中有两个模块副本加载 (例如 ntdll,则它只会匹配传递的特定实例。 如果卸载并重新加载该 DLL,该 DLL 也将不再匹配。 签名与调试器所称模块的特定实例相关联。

要求

要求
Header dbgmodel.h

另请参阅

IDebugHostSymbols 接口

FindModuleByName

CreateTypeSignatureForModuleRange