Condividi tramite


Metodo IModelMethod::Call (dbgmodel.h)

Il metodo Call è il modo in cui viene richiamato qualsiasi metodo definito nel modello di dati. Il chiamante è responsabile del passaggio di un oggetto istanza accurato (questo puntatore) e di un set arbitrario di argomenti. Viene restituito il risultato del metodo e dei metadati facoltativi associati a tale risultato. I metodi che non restituiscono logicamente un valore devono comunque restituire un IModelObject valido. In tal caso, IModelObject è un valore boxed senza valore. Nel caso in cui un metodo non riesca, può restituire informazioni facoltative sull'errore esteso nell'argomento di input (anche se il valore HRESULT restituito è un errore). È fondamentale che i chiamanti verifichino questo problema.

Un metodo sottostante può scegliere di fornire la propria implementazione di "risoluzione dell'overload" eseguendo azioni diverse in base ai tipi effettivi o alla quantità dei relativi argomenti di input. Il modello di dati non fornisce assistenza per tale tipo.

Sintassi

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

Parametri

pContextObject

Oggetto di contesto (istanza di questo puntatore) da cui è stato recuperato il metodo.

argCount

Numero di argomenti passati alla chiamata al metodo.

ppArguments

Matrice di oggetti IModelObject , uno per ogni argomento nella chiamata.

ppResult

Valore restituito della chiamata. Nel caso in cui la chiamata non restituisca semanticamente alcun valore, verrà restituito un oggetto valore boxed. Se la chiamata ha esito negativo (come indicato da HRESULT non riuscito), le informazioni facoltative sull'errore esteso potrebbero essere presenti qui.

ppMetadata

I metadati facoltativi relativi al risultato della chiamata possono essere inseriti qui.

Valore restituito

Questo metodo restituisce HRESULT che indica l'esito positivo o negativo.

Commenti

Codice di esempio

// 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;
    }
};

Requisiti

Requisito Valore
Intestazione dbgmodel.h

Vedi anche

Interfaccia IModelMethod