Partilhar via


Função DispGetParam (oleauto.h)

Recupera um parâmetro da estrutura DISPPARAMS, verificando parâmetros nomeados e parâmetros posicionais e coagi o parâmetro ao tipo especificado.

Sintaxe

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

Parâmetros

[in] pdispparams

Os parâmetros passados para Invoke.

position

A posição do parâmetro na lista de parâmetros. DispGetParam começa no final da matriz; portanto, se position for 0, o último parâmetro na matriz será retornado.

vtTarg

O tipo ao qual o argumento deve ser coagido.

[out] pvarResult

a variante para a qual passar o parâmetro.

[out, optional] puArgErr

No retorno, o índice do argumento que causou um erro de DISP_E_TYPEMISMATCH. Esse ponteiro é retornado a Invoke para indicar a posição do argumento em DISPPARAMS que causou o erro.

Retornar valor

Essa função pode retornar um desses valores.

Código de retorno Descrição
S_OK
Êxito.
DISP_E_BADVARTYPE
Não há suporte para o tipo variante vtTarg .
DISP_E_OVERFLOW
O parâmetro recuperado não pôde ser coagido ao tipo especificado.
DISP_E_PARAMNOTFOUND
Não foi possível encontrar o parâmetro indicado por posição .
DISP_E_TYPEMISMATCH
O argumento não pôde ser coagido ao tipo especificado.
E_INVALIDARG
Um dos parâmetros não é válido.
E_OUTOFMEMORY
Memória insuficiente para concluir a operação.

Comentários

O parâmetro de saída pvarResult deve ser uma variante válida. Qualquer conteúdo existente é lançado da maneira padrão. O conteúdo da variante é liberado com VariantFree.

Se você tiver usado DispGetParam para obter o lado direito de uma operação de colocação de propriedade, o segundo parâmetro deverá ser DISPID_PROPERTYPUT. Por exemplo:

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

Parâmetros nomeados não podem ser acessados posicionalmente e vice-versa.

Exemplos

O exemplo a seguir usa DispGetParam para definir propriedades X e Y.

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;
}

Requisitos

Requisito Valor
Plataforma de Destino Windows
Cabeçalho oleauto.h
Biblioteca OleAut32.lib
DLL OleAut32.dll

Confira também

Createstddispatch

Criação de funções de API de Expedição

IDispatch

IDispatch::Invoke