IModelMethod::Call 메서드(dbgmodel.h)

Call 메서드는 데이터 모델에 정의된 모든 메서드가 호출되는 방식입니다. 호출자는 정확한 인스턴스 개체(이 포인터) 및 임의의 인수 집합을 전달해야 합니다. 메서드의 결과 및 해당 결과와 연결된 선택적 메타데이터가 반환됩니다. 값을 논리적으로 반환하지 않는 메서드는 유효한 IModelObject를 반환해야 합니다. 이 경우 IModelObject 는 boxed no 값입니다. 메서드가 실패하는 경우 입력 인수에서 선택적 확장 오류 정보를 반환할 수 있습니다(반환된 HRESULT가 실패하더라도). 호출자가 이를 확인하는 것이 필수적입니다.

기본 메서드는 입력 인수의 실제 형식 또는 수량에 따라 다른 작업을 수행하는 "오버로드 확인"의 자체 구현을 제공하도록 선택할 수 있습니다. 데이터 모델은 이에 대한 지원을 제공하지 않습니다.

구문

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

매개 변수

pContextObject

메서드를 가져온 컨텍스트 개체(이 포인터 인스턴스)입니다.

argCount

메서드 호출에 전달되는 인수의 수입니다.

ppArguments

호출의 각 인수에 대해 하나씩 IModelObject 개체의 배열입니다.

ppResult

호출의 반환 값입니다. 호출이 의미상 아무 것도 반환하지 않는 경우 boxed 값 개체가 반환되지 않습니다. 호출이 실패하는 경우(실패한 HRESULT로 표시된 대로) 선택적 확장 오류 정보가 여기에 있을 수 있습니다.

ppMetadata

호출 결과에 대한 선택적 메타데이터는 여기에 배치될 수 있습니다.

반환 값

이 메서드는 성공 또는 실패를 나타내는 HRESULT를 반환합니다.

설명

예제 코드

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

요구 사항

   
헤더 dbgmodel.h

참고 항목

IModelMethod 인터페이스