Método IDataModelConcept::InitializeObject (dbgmodel.h)
Un modelo de datos se puede registrar como visualizador canónico o como una extensión para un tipo nativo determinado a través de los métodos RegisterModelForTypeSignature o RegisterExtensionForTypeSignature del administrador de modelos de datos. Cuando se registra un modelo a través de cualquiera de estos métodos, el modelo de datos se adjunta automáticamente como modelo primario a cualquier objeto nativo cuyo tipo coincida con la firma pasada en el registro. En el punto donde se realizan automáticamente los datos adjuntos, se llama al método InitializeObject en el modelo de datos. Se pasa el objeto de instancia, la firma de tipo que provocó los datos adjuntos y un enumerador que genera las instancias de tipo (en orden lineal) que coinciden con los caracteres comodín de la firma de tipo. La implementación del modelo de datos puede usar esta llamada al método para inicializar las memorias caché que requiere.
Sintaxis
HRESULT InitializeObject(
IModelObject *modelObject,
IDebugHostTypeSignature *matchingTypeSignature,
IDebugHostSymbolEnumerator *wildcardMatches
);
Parámetros
modelObject
Objeto de instancia que se está inicializando.
matchingTypeSignature
Firma de tipo con la que coincide el tipo nativo de modelObject que provocó los datos adjuntos del modelo de datos.
wildcardMatches
Si la firma de tipo coincidente incluye caracteres comodín, este argumento contendrá un enumerador que enumerará cómo coincide cada carácter comodín. Normalmente, cada IDebugHostSymbol enumerado aquí es un IDebugHostType. Es decir, no es un requisito. Los argumentos de plantilla que no son de tipo (entre otras cosas) pueden coincidir con caracteres comodín y pueden generar símbolos como IDebugHostConstant.
Valor devuelto
Este método devuelve HRESULT que indica éxito o error. Si se produce un error en este método, se impedirá la construcción de objetos de la instancia.
Comentarios
Tenga en cuenta que una implementación del modelo de datos determinado no puede suponer que la llamada InitializeObject se realizará para cada objeto al que se adjunta el modelo de datos. Como el modelo de datos es un sistema completamente dinámico, es totalmente posible que un autor de la llamada adquiera directamente un modelo (a través de, por ejemplo, el método GetParentModel en IModelObject) y adjuntarlo manualmente. En tal circunstancia, la llamada InitializeObject no se habrá realizado y la implementación debe estar preparada para hacerlo. La llamada a este método es una optimización para permitir que las implementaciones costosas se rellenan previamente y reinicializan las cachés de requisitos.
Ejemplo de implementación
Tenga en cuenta que un cliente nunca llamará a esta interfaz.
//
// InitializeObject is an implementation of the interface method on some
// class representing a data model. Consider that the class has a GetObject() method
// which returns the IModelObject for the data model
//
// Let's also imagine that this registered for the type signature "std::vector<*>"
//
IFACEMETHOD(InitializeObject)(_In_ IModelObject *pContextObject, _In_ IDebugHostTypeSignature *pTypeSignature, _In_ IDebugHostSymbolEnumerator *pWildcardMatches)
{
HRESULT hr = S_OK;
// The minimal implementation is "return S_OK;"
// Typically, this is used to fill cache information. Imagine we have a
// cache in the context data.
ComPtr<IUnknown> spCtxData;
hr = pContextObject->GetContextForDataModel(GetObject(), &spCtxData));
if (SUCCEEDED(hr))
{
CacheData *pCacheData = static_cast<CacheData *>(spCtxData.Get());
// Find the instance type. This is the template argument(s) which
// matched the * in 'std::vector<*>'
ComPtr<IDebugHostSymbol> spFirstMatch;
hr = pWildcardMatches->GetNext(&spFirstMatch));
if (SUCCEEDED(hr))
{
SymnbolKind sk;
ComPtr<IDebugHostType> spFirstType;
if (SUCCEEDED(hr = spFirstMatch->GetSymbolKind(&sk)) && sk == SymbolType &&
SUCCEEDED(hr = spFirstMatch.As(&spFirstType))))
{
pCacheData->SetInstanceType(spFirstType.Get()));
}
}
}
return hr;
}
Requisitos
Requisito | Valor |
---|---|
Header | dbgmodel.h |