IModelMethod::Call-Methode (dbgmodel.h)
Die Call-Methode ist die Art und Weise, wie jede im Datenmodell definierte Methode aufgerufen wird. Der Aufrufer ist dafür verantwortlich, ein genaues instance -Objekt (dieser Zeiger) und einen beliebigen Satz von Argumenten zu übergeben. Das Ergebnis der Methode und alle optionalen Metadaten, die diesem Ergebnis zugeordnet sind, werden zurückgegeben. Methoden, die einen Wert nicht logisch zurückgeben, müssen trotzdem ein gültiges IModelObject zurückgeben. In einem solchen Fall ist das IModelObject ein boxed no value. Falls eine Methode fehlschlägt, kann sie optional erweiterte Fehlerinformationen im Eingabeargument zurückgeben (auch wenn das zurückgegebene HRESULT ein Fehler ist). Es ist unbedingt erforderlich, dass Anrufer dies überprüfen.
Eine zugrunde liegende Methode kann eine eigene Implementierung der "Überladungsauflösung" bereitstellen, die verschiedene Aktionen basierend auf den tatsächlichen Typen oder der Menge ihrer Eingabeargumente ausführt. Das Datenmodell bietet hierfür keine Unterstützung.
Syntax
HRESULT Call(
IModelObject *pContextObject,
ULONG64 argCount,
IModelObject **ppArguments,
_COM_Errorptr_ IModelObject **ppResult,
IKeyStore **ppMetadata
);
Parameter
pContextObject
Das Kontextobjekt (instance diesem Zeiger), von dem die Methode abgerufen wurde.
argCount
Die Anzahl der Argumente, die an den Methodenaufruf übergeben werden.
ppArguments
Ein Array von IModelObject-Objekten , eines für jedes Argument im Aufruf.
ppResult
Der Rückgabewert des Aufrufs. Für den Fall, dass der Aufruf semantisch nichts zurückgibt, wird ein boxed no value-Objekt zurückgegeben. Sollte der Aufruf fehlschlagen (wie durch ein fehlerhaftes HRESULT angegeben), sind hier möglicherweise optionale erweiterte Fehlerinformationen vorhanden.
ppMetadata
Optionale Metadaten zum Aufrufergebnis können hier platziert werden.
Rückgabewert
Diese Methode gibt HRESULT zurück, das auf Erfolg oder Fehler hinweist.
Hinweise
Beispielcode
// 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;
}
};
Anforderungen
Anforderung | Wert |
---|---|
Header | dbgmodel.h |