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;
}
};
要求
要求 | 价值 |
---|---|
标头 | dbgmodel.h |