Méthode IPreferredRuntimeTypeConcept ::CastToPreferredRuntimeType (dbgmodel.h)
La méthode CastToPreferredRuntimeType est appelée chaque fois qu’un client souhaite tenter de passer d’un type statique instance au type d’exécution de ce instance. Si l’objet en question prend en charge (via l’un de ses modèles parents attachés) le concept de type d’exécution préféré, cette méthode est appelée pour effectuer la conversion. Cette méthode peut renvoyer l’objet d’origine (il n’y a pas de conversion ou il n’a pas pu être analysé), retourner une nouvelle instance du type d’exécution, échouer pour des raisons non sémantiques (par exemple : mémoire insuffisante) ou retourner E_NOT_SET. Le code d’erreur E_NOT_SET est un code d’erreur très spécial qui indique au modèle de données que l’implémentation ne souhaite pas remplacer le comportement par défaut et que le modèle de données doit revenir à l’analyse effectuée par l’hôte de débogage (par exemple : analyse RTTI, examen de la forme des tables de fonctions virtuelles, etc.) etc...)
Syntaxe
HRESULT CastToPreferredRuntimeType(
IModelObject *contextObject,
_COM_Errorptr_ IModelObject **object
);
Paramètres
contextObject
Objet instance typé statiquement (ce pointeur) pour lequel effectuer l’analyse et tenter de passer au type d’exécution.
object
Si une conversion en type runtime s’est produite, il s’agit d’une nouvelle instance typée en fonction du type d’exécution. Si l’analyse n’a pas pu être effectuée ou s’il n’y a pas eu de modification dans le type, il peut s’agir de l’objet d’origine.
Valeur retournée
Cette méthode retourne HRESULT qui indique la réussite ou l’échec.
Remarques
Exemple d’implémentation :
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;
}
Configuration requise
Condition requise | Valeur |
---|---|
En-tête | dbgmodel.h |