Método IDebugHost::GetDefaultMetadata (dbgmodel.h)
O método GetDefaultMetadata retorna um repositório de metadados padrão que pode ser usado para determinadas operações (por exemplo, conversão de cadeia de caracteres) quando nenhum metadado explícito foi passado. Isso permite que o host de depuração tenha algum controle sobre a forma como alguns dados são apresentados. Por exemplo, os metadados padrão podem incluir uma chave PreferredRadix, permitindo que o host indique se ordinais devem ser exibidos em decimal ou hexadecimal se não for especificado de outra forma.
Observe que os valores de propriedade no repositório de metadados padrão devem ser resolvidos manualmente e devem passar o objeto para o qual os metadados padrão estão sendo consultados. O método GetKey deve ser usado em vez de GetKeyValue.
Sintaxe
HRESULT GetDefaultMetadata(
IKeyStore **defaultMetadataStore
);
Parâmetros
defaultMetadataStore
O repositório de metadados padrão do host de depuração é retornado aqui.
Retornar valor
Esse método retorna HRESULT que indica êxito ou falha.
Comentários
Exemplo de código
Exemplo de uso (normalmente chamado pelo próprio modelo de dados):
ComPtr<IDebugHost> spHost; /* get the debug host */
ComPtr<IModelObject> spObject; /* find some object that we want default metadata for */
ComPtr<IKeyStore> spDefaultMetadata;
if (SUCCEEDED(spHost->GetDefaultMetadata(&spDefaultMetadata)))
{
// Query the preferred display radix for spObject. We must resolve the
// property manually and pass spObject as the context object.
// This allows the default store to do things like say "radix is 10 for
// signed types and 16 for unsigned types"
ComPtr<IModelObject> spRadixKey;
if (SUCCEEDED(spDefaultMetadata->GetKey(L"PreferredRadix", &spRadixKey, nullptr)))
{
// There is a default radix in which to display spObject. Resolve
// the property manually.
ModelObjectKind kind;
if (SUCCEEDED(spRadixKey->GetKind(&kind)))
{
if (kind == ObjectPropertyAccessor)
{
VARIANT vtProp;
if (SUCCEEDED(spRadixKey->GetIntrinsicValue(&vtProp)))
{
// There is an *in process* guarantee that the IUnknown
// is IModelPropertyAccessor because of ObjectPropertyAccessor
IModelPropertyAccessor *pProperty =
static_cast<IModelPropertyAccessor *>(vtProp.punkVal);
ComPtr<IModelObject> spRadix;
if (SUCCEEDED(pProperty->GetValue(L"PreferredRadix",
spObject.Get(),
&spRadix)))
{
// spRadix contains the display radix. Unbox
// with GetIntrinsicValueAs.
}
VariantClear(&vtProp);
}
}
else
{
// spRadixKey contains the display radix. Unbox
// with GetIntrinsicValueAs.
}
}
}
}
Exemplo de implementação (um host normalmente faria isso):
// Define a property which returns a radix of 16 for unsigned values and 10
// for signed values
class RadixProperty :
public Microsoft::WRL::RuntimeClass<
Microsoft::WRL::RuntimeClassFlags<
Microsoft::WRL::RuntimeClassType::ClassicCom
>,
IModelPropertyAccessor
>
{
public:
IFACEMETHOD(GetValue)(_In_ PCWSTR /*pwszKeyName*/,
_In_opt_ IModelObject *pContextObject,
_Out_ IModelObject **ppValue)
{
HRESULT hr = S_OK;
*ppValue = nullptr;
unsigned int radix = 0;
if (pContextObject != nullptr)
{
ModelObjectKind kind;
hr = pContextObject->GetKind(&kind);
if (SUCCEEDED(hr) && kind == ObjectIntrinsic)
{
VARIANT vtValue;
if (SUCCEEDED(pContextObject->GetIntrinsicValue(&vtValue)))
{
switch(vtValue.vt)
{
case VT_I1: case VT_I2: case VT_I4: case VT_I8:
radix = 10;
break;
case VT_UI1: case VT_UI2: case VT_UI4: case VT_UI8:
radix = 16;
break;
}
VariantClear(&vtValue);
}
}
}
ComPtr<IModelObject> spResultRadix;
if (SUCCEEDED(hr) && radix != 0)
{
VARIANT vtRadix;
vtRadix.vt = VT_UI4;
vtRadix.ulVal = radix;
hr = GetManager()->CreateIntrinsicObject(ObjectIntrinsic,
&vtRadix,
&spResultRadix);
}
else if (SUCCEEDED(hr) && radix == 0)
{
// We succeeded but don't have a defined radix. Return no value.
hr = GetManager()->CreateNoValue(&spResultRadix);
}
if (SUCCEEDED(hr))
{
*ppValue = spResultRadix.Detach();
}
return hr;
}
IFACEMETHOD(SetValue)(_In_ PCWSTR /*pwszKeyName*/,
_In_opt_ IModelObject * /*pContextObject*/,
_In_ IModelObject * /*pValue*/)
{
return E_NOTIMPL;
}
};
// Implementation on the implementation class for IDebugHost:
IFACEMETHOD(GetDefaultMetadata)(_Out_ IKeyStore **ppMetadata)
{
HRESULT hr = S_OK;
*ppMetadata = nullptr;
ComPtr<IKeyStore> spMetadata;
hr = GetManager()->CreateMetadataStore(&spMetadata));
if (SUCCEEDED(hr))
{
ComPtr<RadixProperty> spProperty = Microsoft::WRL::Make<RadixProperty>();
if (spProperty == nullptr)
{
hr = E_OUTOFMEMORY;
}
else
{
VARIANT vtProp;
vtProp.vt = VT_UNKNOWN;
vtProp.punkVal = static_cast<IModelPropertyAccessor *>(spProperty.Get());
ComPtr<IModelObject> spPropertyObject;
hr = GetManager()->CreateIntrinsicObject(ObjectPropertyAccessor,
&vtProp,
&spPropertyObject));
if (SUCCEEDED(hr))
{
hr = spDefaultMetadata->SetKey(L"PreferredRadix",
spPropertyObject.Get(),
nullptr));
}
}
}
if (SUCCEEDED(hr))
{
*ppMetaData = spMetadata.Detach();
}
return hr;
}
Requisitos
Requisito | Valor |
---|---|
Cabeçalho | dbgmodel.h |