Freigeben über


IModelMethod::Call-Methode (dbgmodel.h)

Die Call-Methode ist die Art und Weise, wie jede im Datenmodell definierte Methode aufgerufen wird. Der Aufrufer ist dafür verantwortlich, ein genaues instance -Objekt (dieser Zeiger) und einen beliebigen Satz von Argumenten zu übergeben. Das Ergebnis der Methode und alle optionalen Metadaten, die diesem Ergebnis zugeordnet sind, werden zurückgegeben. Methoden, die einen Wert nicht logisch zurückgeben, müssen trotzdem ein gültiges IModelObject zurückgeben. In einem solchen Fall ist das IModelObject ein boxed no value. Falls eine Methode fehlschlägt, kann sie optional erweiterte Fehlerinformationen im Eingabeargument zurückgeben (auch wenn das zurückgegebene HRESULT ein Fehler ist). Es ist unbedingt erforderlich, dass Anrufer dies überprüfen.

Eine zugrunde liegende Methode kann eine eigene Implementierung der "Überladungsauflösung" bereitstellen, die verschiedene Aktionen basierend auf den tatsächlichen Typen oder der Menge ihrer Eingabeargumente ausführt. Das Datenmodell bietet hierfür keine Unterstützung.

Syntax

HRESULT Call(
  IModelObject                *pContextObject,
  ULONG64                     argCount,
  IModelObject                **ppArguments,
  _COM_Errorptr_ IModelObject **ppResult,
  IKeyStore                   **ppMetadata
);

Parameter

pContextObject

Das Kontextobjekt (instance diesem Zeiger), von dem die Methode abgerufen wurde.

argCount

Die Anzahl der Argumente, die an den Methodenaufruf übergeben werden.

ppArguments

Ein Array von IModelObject-Objekten , eines für jedes Argument im Aufruf.

ppResult

Der Rückgabewert des Aufrufs. Für den Fall, dass der Aufruf semantisch nichts zurückgibt, wird ein boxed no value-Objekt zurückgegeben. Sollte der Aufruf fehlschlagen (wie durch ein fehlerhaftes HRESULT angegeben), sind hier möglicherweise optionale erweiterte Fehlerinformationen vorhanden.

ppMetadata

Optionale Metadaten zum Aufrufergebnis können hier platziert werden.

Rückgabewert

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

Hinweise

Beispielcode

// The full implementation class is shown for clarity.  This is a method which sums up all integers passed to it.
class MySummationMethod :
    public Microsoft::WRL::RuntimeClass<
        Microsoft::WRL::RuntimeClassFlags<
            Microsoft::WRL::RuntimeClassType::ClassicCom
            >,
        IModelMethod
        >
{
public:

    // The method is 'static'.  Ignore pContextObject.
    IFACEMETHOD(Call)(_In_ IModelObject * /*pContextObject*/, 
                      _In_ ULONG64 argCount, 
                      _In_reads_(argCount) IModelObject **ppArguments, 
                      _COM_Errorptr_ IModelObject **ppResult,
                      _COM_Outptr_opt_result_maybenull_ IKeyStore **ppMetadata)
    {
        HRESULT hr = S_OK;
        *ppResult = nullptr;
        if (ppMetadata != nullptr)
        {
             *ppMetadata = nullptr;
        }

        if (argCount == 0)
        {
            // Example of a specific error message.
            GetManager()->CreateErrorObject(
                E_INVALIDARG, 
                L"At least one argument must be passed to the Sum() method", 
                ppResult);
            return E_INVALIDARG;
        }

        int sum = 0;
        for (ULONG64 i = 0; i < argCount; ++i)
        {
            VARIANT vtValue;
            hr = ppArguments[i]->GetIntrinsicValueAs(VT_I4, &vtValue);
            if (FAILED(hr))
            {
                // If we couldn't unbox as I4, someone passed an invalid argument.
                // As an example, be specific.
                GetManager()->CreateErrorObject(
                    E_INVALIDARG, 
                    L"All arguments passed to the Sum() method must be integers", 
                    ppResult);
                return E_INVALIDARG;
            }

            sum += vtValue.lVal;
        }

        VARIANT vtSum;
        vtSum.vt = VT_I4;
        vtSum.lVal = sum;

        ComPtr<IModelObject> spSum;
        hr = GetManager()->CreateIntrinsicObject(ObjectIntrinsic, &vtSum, &spSum);
        if (SUCCEEDED(hr))
        {
            *ppResult = spSum.Detach();
        }
        return hr;
    }
};

Anforderungen

Anforderung Wert
Header dbgmodel.h

Weitere Informationen

IModelMethod-Schnittstelle