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

呼び出しの引数ごとに 1 つずつ、 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 インターフェイス