IDebugHost::GetDefaultMetadata 메서드(dbgmodel.h)
GetDefaultMetadata 메서드는 명시적 메타데이터가 전달되지 않은 경우 특정 작업(예: 문자열 변환)에 사용할 수 있는 기본 메타데이터 저장소를 반환합니다. 이를 통해 디버그 호스트는 일부 데이터가 표시되는 방식을 제어할 수 있습니다. 예를 들어 기본 메타데이터에는 PreferredRadix 키가 포함될 수 있습니다. 그렇지 않으면 호스트가 서수를 10진수 또는 16진수로 표시할지 여부를 나타낼 수 있습니다.
기본 메타데이터 저장소의 속성 값은 수동으로 확인되어야 하며 기본 메타데이터가 쿼리되는 개체를 전달해야 합니다. GetKeyValue 대신 GetKey 메서드를 사용해야 합니다.
구문
HRESULT GetDefaultMetadata(
IKeyStore **defaultMetadataStore
);
매개 변수
defaultMetadataStore
디버그 호스트의 기본 메타데이터 저장소가 여기에 반환됩니다.
반환 값
이 메서드는 성공 또는 실패를 나타내는 HRESULT를 반환합니다.
설명
코드 예제
사용 예제(일반적으로 데이터 모델 자체에서 호출됨):
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.
}
}
}
}
구현 예제(호스트는 일반적으로 이 작업을 수행합니다.)
// 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;
}
요구 사항
요구 사항 | 값 |
---|---|
헤더 | dbgmodel.h |