Поделиться через


Метод IPreferredRuntimeTypeConcept::CastToPreferredRuntimeType (dbgmodel.h)

Метод CastToPreferredRuntimeType вызывается всякий раз, когда клиент пытается преобразовать из экземпляра статического типа в тип среды выполнения этого экземпляра. Если объект, указанный в вопросе, поддерживает (через одну из присоединенных родительских моделей) предпочтительную концепцию типа среды выполнения, этот метод будет вызван для выполнения преобразования. Этот метод может возвращать исходный объект (преобразование отсутствует или не удалось проанализировать), возвратить новый экземпляр типа среды выполнения, завершиться сбоем из-за неемантических причин (например, вне памяти) или вернуть E_NOT_SET. Код ошибки E_NOT_SET — это очень специальный код ошибки, указывающий на модель данных, которую реализация не хочет переопределить поведение по умолчанию, и что модель данных должна вернуться к тому, что анализ выполняется узлом отладки (например, анализ RTTI, проверка формы таблиц виртуальных функций, и т. д.)

Синтаксис

HRESULT CastToPreferredRuntimeType(
  IModelObject                *contextObject,
  _COM_Errorptr_ IModelObject **object
);

Параметры

contextObject

Статически типизированный объект экземпляра (этот указатель), для которого необходимо выполнить анализ и попытаться переадресовать тип среды выполнения.

object

Если произошло преобразование в тип среды выполнения, это новый экземпляр, типизированный в соответствии с типом среды выполнения. Если не удалось выполнить анализ или не было изменений в типе, это может быть исходный объект.

Возвращаемое значение

Этот метод возвращает HRESULT, указывающий на успех или сбой.

Замечания

Пример реализации :

IFACEMETHOD(CastToPreferredRuntimeType)(_In_ IModelObject *pContextObject, 
                                        _COM_Outptr_ IModelObject **ppRuntimeObject)
{
    HRESULT hr = S_OK;
    *ppRuntimeObject = nullptr;

    ComPtr<IModelObject> spRuntimeObject;

    // Imagine this was on a class for a data model registered against some 
    // IFoo type where IFoo was always backed by CFoo (the type of which is 
    // stored in m_spType) and the offset between IFoo and CFoo was m_runtimeOffset.
    Location loc;
    hr = pContextObject->GetLocation(&loc);
    if (SUCCEEDED(hr))
    {
        loc.Offset -= m_runtimeOffset;

        // By passing 'nullptr' as the context, it will inherit its context 
        // from the passed type.  Sufficient for *THIS* purpose in *MOST* cases.
        hr = GetManager()->CreateTypedObject(nullptr, 
                                             loc, 
                                             m_spType.Get(), 
                                             &spRuntimeObject);
    }

    if (SUCCEEDED(hr))
    {
        *ppRuntimeObject = spRuntimeObject.Detach();
    }

    return hr;
}

Требования

Требование Ценность
заголовка dbgmodel.h

См. также

интерфейс IPreferredRuntimeTypeConcept