Método IDataModelConcept::InitializeObject (dbgmodel.h)
Um modelo de dados pode ser registrado como visualizador canônico ou como uma extensão para um determinado tipo nativo por meio dos métodos RegisterModelForTypeSignature ou RegisterExtensionForTypeSignature do gerenciador de modelos de dados. Quando um modelo é registrado por meio de qualquer um desses métodos, o modelo de dados é anexado automaticamente como um modelo pai a qualquer objeto nativo cujo tipo corresponda à assinatura passada no registro. No ponto em que esse anexo é feito automaticamente, o método InitializeObject é chamado no modelo de dados. Ele é passado para o objeto de instância, a assinatura de tipo que causou o anexo e um enumerador que produz as instâncias de tipo (em ordem linear) que correspondem a quaisquer caracteres curinga na assinatura de tipo. A implementação do modelo de dados pode usar essa chamada de método para inicializar os caches necessários.
Sintaxe
HRESULT InitializeObject(
IModelObject *modelObject,
IDebugHostTypeSignature *matchingTypeSignature,
IDebugHostSymbolEnumerator *wildcardMatches
);
Parâmetros
modelObject
O objeto de instância que está sendo inicializado.
matchingTypeSignature
A assinatura de tipo com a qual o tipo nativo de modelObject correspondeu que causou o anexo do modelo de dados.
wildcardMatches
Se a assinatura de tipo correspondente incluir caracteres curinga, esse argumento conterá um enumerador que enumerará como cada caractere curinga correspondeu. Normalmente, cada IDebugHostSymbol enumerado aqui é um IDebugHostType. Isso não é, no entanto, um requisito. Argumentos de modelo não tipo (entre outras coisas) podem corresponder a curingas e podem produzir símbolos como IDebugHostConstant.
Retornar valor
Esse método retorna HRESULT que indica êxito ou falha. A falha desse método impedirá a construção do objeto da instância.
Comentários
Observe que uma determinada implementação de modelo de dados não pode assumir que a chamada InitializeObject será feita para cada objeto ao qual o modelo de dados está anexado. Como o modelo de dados é um sistema completamente dinâmico, é inteiramente possível que um chamador adquira diretamente um modelo (por exemplo, o método GetParentModel em IModelObject) e anexe-o manualmente. Em tal circunstância, a chamada InitializeObject não terá sido feita e a implementação deve estar preparada para fazer isso. A chamada desse método é uma otimização para permitir que implementações caras pré-armazenem e pré-inicializem caches de requisitos.
Exemplo de implementação
Observe que um cliente nunca chamará essa interface.
//
// 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 |
---|---|
Cabeçalho | dbgmodel.h |