IModelMethod ::Call, méthode (dbgmodel.h)
La méthode Call est la façon dont n’importe quelle méthode définie dans le modèle de données est appelée. L’appelant est responsable du passage d’un objet d’instance précis (ce pointeur) et d’un ensemble arbitraire d’arguments. Le résultat de la méthode et toutes les métadonnées facultatives associées à ce résultat sont retournées. Les méthodes qui ne retournent pas logiquement une valeur doivent toujours retourner une IModelObject valide. Dans ce cas, la IModelObject est une valeur non boxée. En cas d’échec d’une méthode, elle peut retourner des informations d’erreur étendues facultatives dans l’argument d’entrée (même si le HRESULT retourné est un échec). Il est impératif que les appelants vérifient cela.
Une méthode sous-jacente peut choisir de fournir sa propre implémentation de « résolution de surcharge » effectuant différentes actions en fonction des types réels ou de la quantité de ses arguments d’entrée. Le modèle de données ne fournit aucune assistance pour ce type de données.
Syntaxe
HRESULT Call(
IModelObject *pContextObject,
ULONG64 argCount,
IModelObject **ppArguments,
_COM_Errorptr_ IModelObject **ppResult,
IKeyStore **ppMetadata
);
Paramètres
pContextObject
Objet de contexte (instance de ce pointeur) à partir duquel la méthode a été extraite.
argCount
Nombre d’arguments passés à l’appel de méthode.
ppArguments
Tableau d’objets IModelObject, un pour chaque argument de l’appel.
ppResult
Valeur de retour de l’appel. Si l’appel renvoie sémantiquement rien, aucun objet de valeur boxed n’est retourné. Si l’appel échoue (comme indiqué par un HRESULT défaillant), des informations d’erreur étendues facultatives peuvent être présentes ici.
ppMetadata
Les métadonnées facultatives sur le résultat de l’appel peuvent être placées ici.
Valeur de retour
Cette méthode retourne HRESULT qui indique la réussite ou l’échec.
Remarques
exemple de code
// 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;
}
};
Exigences
Exigence | Valeur |
---|---|
d’en-tête | dbgmodel.h |