Freigeben über


DispGetParam-Funktion (oleauto.h)

Ruft einen Parameter aus der DISPPARAMS-Struktur ab, überprüft sowohl benannte Parameter als auch Positionsparameter und wandelt den Parameter in den angegebenen Typ um.

Syntax

HRESULT DispGetParam(
  [in]            DISPPARAMS *pdispparams,
                  UINT       position,
                  VARTYPE    vtTarg,
  [out]           VARIANT    *pvarResult,
  [out, optional] UINT       *puArgErr
);

Parameter

[in] pdispparams

Die an Invoke übergebenen Parameter.

position

Die Position des Parameters in der Parameterliste. DispGetParam beginnt am Ende des Arrays. Wenn position also 0 ist, wird der letzte Parameter im Array zurückgegeben.

vtTarg

Der Typ, in den das Argument zwangsgefränkt werden soll.

[out] pvarResult

die Variante, an die der Parameter übergeben werden soll.

[out, optional] puArgErr

Bei der Rückgabe der Index des Arguments, das einen DISP_E_TYPEMISMATCH Fehler verursacht hat. Dieser Zeiger wird an Invoke zurückgegeben, um die Position des Arguments in DISPPARAMS anzugeben, das den Fehler verursacht hat.

Rückgabewert

Diese Funktion kann einen dieser Werte zurückgeben.

Rückgabecode BESCHREIBUNG
S_OK
Erfolg.
DISP_E_BADVARTYPE
Der Variantentyp vtTarg wird nicht unterstützt.
DISP_E_OVERFLOW
Der abgerufene Parameter konnte nicht in den angegebenen Typ umgewandelt werden.
DISP_E_PARAMNOTFOUND
Der durch position angegebene Parameter konnte nicht gefunden werden.
DISP_E_TYPEMISMATCH
Das Argument konnte nicht in den angegebenen Typ umgewandelt werden.
E_INVALIDARG
Einer der Parameter ist ungültig.
E_OUTOFMEMORY
Unzureichender Arbeitsspeicher, um den Vorgang abzuschließen.

Hinweise

Der Ausgabeparameter pvarResult muss eine gültige Variante sein. Alle vorhandenen Inhalte werden standardmäßig freigegeben. Die Inhalte der Variante werden mit VariantFree freigegeben.

Wenn Sie DispGetParam verwendet haben, um die rechte Seite eines Property Put-Vorgangs abzurufen, sollte der zweite Parameter DISPID_PROPERTYPUT sein. Beispiel:

DispGetParam(&dispparams, DISPID_PROPERTYPUT, VT_BOOL, &varResult, &uiArg)

Auf benannte Parameter kann nicht positioniert zugegriffen werden und umgekehrt.

Beispiele

Im folgenden Beispiel wird DispGetParam verwendet, um die Eigenschaften X und Y festzulegen.

STDMETHODIMP
CPoint::Invoke(
   DISPID dispidMember,
   REFIID riid,
   LCID lcid,
   unsigned short wFlags,
   DISPPARAMS * pdispparams,
   VARIANT * pvarResult,
   EXCEPINFO * pExcepInfo,
   unsigned int * puArgErr)
{
   unsigned int uArgErr;
   HRESULT hresult;
   VARIANTARG varg0;
   VARIANT varResultDummy;

   // Make sure the wFlags are valid.
   if(wFlags & ~(DISPATCH_METHOD | DISPATCH_PROPERTYGET |
      DISPATCH_PROPERTYPUT | DISPATCH_PROPERTYPUTREF))
      return E_INVALIDARG;

   // This object only exposes a "default" interface.
   if(!IsEqualIID(riid, IID_NULL))
      return DISP_E_UNKNOWNINTERFACE;

   // It simplifies the following code if the caller
   // ignores the return value.
   if(puArgErr == NULL)
      puArgErr = &uArgErr;
   if(pvarResult == NULL)
      pvarResult = &varResultDummy;

   VariantInit(&varg0);

   // Assume the return type is void, unless otherwise is found.
   VariantInit(pvarResult);

   switch(dispidMember){
   case IDMEMBER_CPOINT_GETX:
      V_VT(pvarResult) = VT_I2;
      V_I2(pvarResult) = GetX();
      break;

   case IDMEMBER_CPOINT_SETX:
      hresult = DispGetParam(pdispparams, 0, VT_I2, &varg0, puArgErr);
      if(hresult != NOERROR)
         return hresult;
      SetX(V_I2(&varg0));
      break;

   case IDMEMBER_CPOINT_GETY:
      V_VT(pvarResult) = VT_I2;
      V_I2(pvarResult) = GetY();
      break;

   case IDMEMBER_CPOINT_SETY:
      hresult = DispGetParam(pdispparams, 0, VT_I2, &varg0, puArgErr);
      if(hresult != NOERROR)
         return hresult;
      SetY(V_I2(&varg0));
      break;

   default:
      return DISP_E_MEMBERNOTFOUND;
   }
   return NOERROR;
}

Anforderungen

Anforderung Wert
Zielplattform Windows
Kopfzeile oleauto.h
Bibliothek OleAut32.lib
DLL OleAut32.dll

Weitere Informationen

CreateStdDispatch

Erstellen von Dispatch-API-Funktionen

IDispatch

IDispatch::Invoke