IModelMethod::Call 方法 (dbgmodel.h)

Call 方法是调用数据模型中定义的任何方法的方式。 调用方负责将此指针) 和任意参数集 (传递准确的实例对象。 将返回 方法的结果以及与该结果关联的任何可选元数据。 在逻辑上不返回值的方法仍必须返回有效的 IModelObject。 在这种情况下, IModelObject 是一个装箱的无值。 如果方法失败,它可能会在输入参数 (返回可选的扩展错误信息,即使返回的 HRESULT 是失败) 。 调用方必须为此检查。

基础方法可以选择提供自己的“重载解析”实现,根据其输入参数的实际类型或数量执行不同的操作。 数据模型不提供此类帮助。

语法

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

参数

pContextObject

上下文对象 (实例此指针) ,从中提取方法。

argCount

传递给方法调用的参数数。

ppArguments

一个 IModelObject 对象的数组,调用中每个参数对应一个。

ppResult

调用的返回值。 如果调用在语义上不返回任何内容,则将返回装箱不返回值对象。 如果调用失败 ((如失败的 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;
    }
};

要求

要求
Header dbgmodel.h

另请参阅

IModelMethod 接口