Compartilhar via


Método IModelObject::SetContextForDataModel (dbgmodel.h)

O método SetContextForDataModel é usado pela implementação de um modelo de dados para colocar dados de implementação em objetos de instância. Conceitualmente, cada IModelObject (chame isso de instância para simplificar) contém uma tabela de hash de estado. A tabela de hash é indexada por outro IModelObject (chame isso de modelo de dados para simplificar), que está na hierarquia de modelo pai da instância. O valor contido neste hash é um conjunto de informações de estado contadas de referência representadas por uma instância IUnknown. Depois que o modelo de dados define esse estado na instância, ele pode armazenar dados arbitrários de implementação que podem ser recuperados durante itens como getters de propriedade.

Geralmente, é o caso de extensões (ou outros componentes do modelo de dados) quererem representar algum constructo sintético como o que se pode considerar um tipo. A exposição do depurador de objetos de processo é um desses exemplos. Frequentemente, uma implementação mapeará a noção de uma definição de tipo para um modelo de dados. O modelo de dados conterá getters de propriedade para os itens expostos no objeto (por exemplo: nome do processo, ID do processo, contagem de threads, threads etc...). Quando é hora de criar uma instância desse modelo de dados, um objeto sintético em branco é criado e o modelo de dados (ou o que podemos considerar a definição de tipo) é anexado como um modelo pai. Em alguns casos, informações suficientes para identificar exclusivamente o objeto e implementar todos os getters de propriedade do modelo de dados podem ser colocadas diretamente no objeto de instância. Em nosso exemplo de processo, a ID do processo pode ser armazenada como uma chave chamada ID na instância. Quando um getter no modelo de dados é chamado, digamos, para o nome do processo, por exemplo, a implementação pode simplesmente chamar o método GetKeyValue para buscar a ID do processo. A implementação necessária para retornar o nome pode fazer isso do PID. Em outros casos, o estado necessário para implementar o tipo é mais complexo, contém outros constructos nativos ou, por outros motivos, não pode ser definido como uma chave de instância. Nesses casos, o modelo de dados construirá uma classe derivada de IUnknown, colocará os dados de implementação dentro dessa classe e chamará o método SetContextForDataModel na instância para associar seus dados de implementação ao objeto de instância. Quando a instância for destruída, a contagem de referência na classe de estado será liberada e ela será liberada conforme necessário

Sintaxe

HRESULT SetContextForDataModel(
  IModelObject *dataModelObject,
  IUnknown     *context
);

Parâmetros

dataModelObject

O IModelObject que representa o modelo de dados para o qual o estado está sendo armazenado em um objeto de instância. Essa é, na verdade, uma chave de hash para o objeto de estado associado.

context

O estado que está sendo associado à instância. O significado exato disso (e de qualquer outra interface, etc... que ele dá suporte) cabe ao modelo de dados que está fazendo a chamada para definir esse estado. O único requisito é que esse estado seja a referência COM contada.

Retornar valor

Esse método retorna HRESULT que indica êxito ou falha.

Comentários

Exemplo de código

ComPtr<IModelObject> spObject;          /* get an object */
ComPtr<IModelObject> spDataModelObject; /* get an attached data model (from earlier
                                           AddParentModel or from GetParentModel) anywhere in 
                                           the ancestor tree */

// Context data must be IUnknown derived.  Otherwise, implementation is opaque to the data model.
class MyContextData :
    public Microsoft::WRL::RuntimeClass<
        Microsoft::WRL::RuntimeClassFlags<Microsoft::WRL::RuntimeClassType::ClassicCom>,
        IUnknown
        >
{
    /* put whatever you want here */
};

ComPtr<MyContextData> spContextData = Microsoft::WRL::Make<MyContextData>();
if (SUCCEEDED(spObject->SetContextForDataModel(spDataModelObject.Get(), spContextData.Get())))
{
    // There is now context data associated with spObject (an instance) for 
    // spDataModelObject (a parent model).  This can be fetched via
    // GetContextForDataModel.  Note that spObject and spDataModelObject only need t
    // to be related.  The model does not need to be an immediate parent.
}

Requisitos

Requisito Valor
Cabeçalho dbgmodel.h

Confira também

Interface IModelObject