Método IModelMethod::Call (dbgmodel.h)
El método Call es la forma en que se invoca cualquier método definido en el modelo de datos. El autor de la llamada es responsable de pasar un objeto de instancia preciso (este puntero) y un conjunto arbitrario de argumentos. Se devuelve el resultado del método y los metadatos opcionales asociados a ese resultado. Los métodos que no devuelven lógicamente un valor todavía deben devolver un IModelObject válido. En tal caso, IModelObject es un valor sin conversión boxed. En caso de que se produzca un error en un método, puede devolver información de error extendida opcional en el argumento de entrada (incluso si hrESULT devuelto es un error). Es imperativo que los autores de las llamadas comprueben esto.
Un método subyacente puede optar por proporcionar su propia implementación de "resolución de sobrecarga" realizando diferentes acciones en función de los tipos reales o la cantidad de sus argumentos de entrada. El modelo de datos no proporciona asistencia para ello.
Sintaxis
HRESULT Call(
IModelObject *pContextObject,
ULONG64 argCount,
IModelObject **ppArguments,
_COM_Errorptr_ IModelObject **ppResult,
IKeyStore **ppMetadata
);
Parámetros
pContextObject
Objeto de contexto (instancia de este puntero) desde el que se capturó el método.
argCount
Número de argumentos que se pasan a la llamada al método.
ppArguments
Matriz de objetos IModelObject , uno para cada argumento de la llamada.
ppResult
Valor devuelto de la llamada. En caso de que la llamada no devuelva nada semánticamente, se devolverá un objeto de valor sin conversión boxed. Si se produce un error en la llamada (como se indica en un HRESULT con errores), puede haber información de error extendida opcional aquí.
ppMetadata
Los metadatos opcionales sobre el resultado de la llamada se pueden colocar aquí.
Valor devuelto
Este método devuelve HRESULT que indica éxito o error.
Comentarios
Código de ejemplo
// 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;
}
};
Requisitos
Requisito | Valor |
---|---|
Header | dbgmodel.h |