Freigeben über


IModelObject::SetContextForDataModel-Methode (dbgmodel.h)

Die SetContextForDataModel-Methode wird von der Implementierung eines Datenmodells verwendet, um Implementierungsdaten in Instanzobjekten zu platzieren. Konzeptionell enthält jedes IModelObject- (diese Instanz der Einfachheit halber aufrufen) eine Hashtabelle des Zustands. Die Hashtabelle wird von einem anderen IModelObject indiziert (rufen Sie dieses Datenmodell aus Gründen der Einfachheit auf), die sich in der übergeordneten Modellhierarchie der Instanz befindet. Der in diesem Hash enthaltene Wert ist eine Reihe von referenzierten Statusinformationen, die durch eine IUnknown-Instanz dargestellt werden. Sobald das Datenmodell diesen Zustand für die Instanz festlegt, kann es beliebige Implementierungsdaten speichern, die während von Eigenschaften-Gettern abgerufen werden können.

Es ist häufig der Fall, dass Erweiterungen (oder andere Datenmodellkomponenten) ein synthetisches Konstrukt darstellen möchten, als das, was man als Typ betrachten könnte. Die Bereitstellung von Prozessobjekten des Debuggers ist ein solches Beispiel. Häufig wird eine Implementierung den Begriff einer Typdefinition einem Datenmodell zuordnen. Das Datenmodell enthält Eigenschafts-Getter für die Dinge, die für das Objekt verfügbar gemacht werden (z. B. Prozessname, Prozess-ID, Threadanzahl, Threads usw.). Wenn es an der Zeit ist, eine Instanz dieses Datenmodells zu erstellen, wird ein leeres synthetisches Objekt erstellt, und das Datenmodell (oder was wir möglicherweise als Typdefinition betrachten) wird als übergeordnetes Modell angefügt. In einigen Fällen können genügend Informationen, um das Objekt eindeutig zu identifizieren und alle Eigenschaften-Getters des Datenmodells zu implementieren, möglicherweise direkt auf das Instanzobjekt platziert werden. In unserem Prozessbeispiel kann die Prozess-ID als Schlüssel mit der Bezeichnung "ID" der Instanz gespeichert werden. Wenn ein Getter für das Datenmodell aufgerufen wird, z. B. für den Prozessnamen, kann die Implementierung einfach die GetKeyValue-Methode aufrufen, um die Prozess-ID abzurufen. Die Implementierung, die erforderlich ist, um den Namen zurückzugeben, kann dies dann über die PID tun. In anderen Fällen ist der zum Implementieren des Typs erforderliche Zustand komplexer, enthält andere systemeigene Konstrukte oder aus anderen Gründen kann nicht als Instanzschlüssel festgelegt werden. In solchen Fällen erstellt das Datenmodell eine von IUnknown abgeleitete Klasse, platziert die Implementierungsdaten in dieser Klasse und ruft die SetContextForDataModel-Methode für die Instanz auf, um die Implementierungsdaten dem Instanzobjekt zuzuordnen. Wenn die Instanz destruktiert, wird die Referenzanzahl für die Zustandsklasse freigegeben, und sie wird nach Bedarf freigegeben.

Syntax

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

Parameter

dataModelObject

Das IModelObject, das das Datenmodell darstellt, für das der Zustand in einem Instanzobjekt gespeichert wird. Dies ist tatsächlich ein Hashschlüssel für das zugeordnete Statusobjekt.

context

Der Zustand, der der Instanz zugeordnet ist. Die genaue Bedeutung dieses (und aller anderen Schnittstellen usw.) ist bis zum Datenmodell, das diesen Zustand aufruft. Die einzige Anforderung besteht darin, dass ein solcher Zustand COM-Verweis gezählt wird.

Rückgabewert

Diese Methode gibt HRESULT zurück, das Erfolg oder Fehler angibt.

Bemerkungen

Codebeispiel

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.
}

Anforderungen

Anforderung Wert
Header- dbgmodel.h

Siehe auch

IModelObject-Schnittstelle