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

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

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

구문

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

매개 변수

pContextObject

메서드가 페치된 컨텍스트 개체(이 포인터 인스턴스)입니다.

argCount

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

ppArguments

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

ppResult

호출의 반환 값입니다. 호출이 의미상 아무 것도 반환하지 않는 경우 boxed no value 개체가 반환됩니다. 호출이 실패하는 경우(실패한 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 인터페이스