Método IModelMethod::Call (dbgmodel.h)

O método Call é a maneira como qualquer método definido no modelo de dados é invocado. O chamador é responsável por passar um objeto de instância preciso (este ponteiro) e um conjunto arbitrário de argumentos. O resultado do método e os metadados opcionais associados a esse resultado são retornados. Os métodos que não retornam logicamente um valor ainda devem retornar um IModelObject válido. Nesse caso, o IModelObject é um valor sem caixa. Caso um método falhe, ele poderá retornar informações de erro estendidas opcionais no argumento de entrada (mesmo que o HRESULT retornado seja uma falha). É fundamental que os chamadores verifiquem isso.

Um método subjacente pode optar por fornecer sua própria implementação de "resolução de sobrecarga" executando diferentes ações com base nos tipos reais ou na quantidade de seus argumentos de entrada. O modelo de dados não fornece assistência para isso.

Sintaxe

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

Parâmetros

pContextObject

O objeto de contexto (instância deste ponteiro) do qual o método foi buscado.

argCount

O número de argumentos que estão sendo passados para a chamada de método.

ppArguments

Uma matriz de objetos IModelObject , uma para cada argumento na chamada.

ppResult

O valor retornado da chamada. No caso de a chamada não retornar nada semanticamente, um objeto de valor sem caixa não será retornado. Se a chamada falhar (conforme indicado por um HRESULT com falha), as informações de erro estendidas opcionais poderão estar presentes aqui.

ppMetadata

Metadados opcionais sobre o resultado da chamada podem ser colocados aqui.

Valor retornado

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

Comentários

Código de exemplo

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

Requisitos

   
Cabeçalho dbgmodel.h

Confira também

Interface IModelMethod