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 |
関連項目
IDebugHost インターフェイス の