Метод 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;
}
};
Требования
Требование | Значение |
---|---|
Заголовок | dbgmodel.h |