Compartilhar via


Passing Parameters

Windows Mobile SupportedWindows Embedded CE Supported

9/8/2008

Argumentos para o método ou propriedade que está sendo chamado são passados na DISPPARAMS estrutura. Essa estrutura consiste o seguinte:

  • Um ponteiro para uma matriz de parâmetros representados como variantes
  • Um ponteiro para uma matriz de DISPIDs para nomeado parâmetros
  • O número de parâmetros em cada matriz

Por exemplo:

typedef struct FARSTRUCT tagDISPPARAMS{
VARIANTARG FAR* rgvarg;          // Array of parameters.
DISPID FAR* rgdispidNamedArgs;   // Dispatch IDs of named parameters.
unsigned int cArgs;              // Number of parameters.
unsigned int cNamedArgs;         // Number of named parameters.
} DISPPARAMS;

Os parâmetros são passedin de matriz rgvarg[], com o número de parâmetros passados em cArgs.

Os parâmetros de matriz devem ser colocados do último ao primeiro, portanto, rgvarg[0] tem o último parâmetro e rgvarg[cArgs 1] tem o primeiro parâmetro. O método ou propriedade pode alteração os valores dos elementos dentro de matriz rgvarg, mas somente se ele tiver definido o sinalizador VT_BYREF. Caso contrário, considere os elementos como somente leitura.

Uma chamada distribuir pode ter nomeado parâmetros bem como parâmetros posicionais.

Se cNamedArgs é 0, todos os elementos de rgvarg[] representam parâmetros posicionais.

Se cNamedArgs não é 0, cada elemento do rgdispidNamedArgs[] contém a DISPID de uma parâmetro nomeado e o valor do parâmetro está no compatível elemento do rgvarg[ ].

Os DISPIDs do nomeado parâmetros são sempre contíguo no rgdispidNamedArgs, e seus valores estão no primeiro cNamedArgs Elementos de rgvarg.

Os parâmetros nomeados não podem ser acessados positionally, e parâmetros posicionais não podem ser nomeado.

O DISPID de um parâmetro é sua posição na lista a parâmetro baseada em zero.

Se você incluir o DISPID com cada parâmetro nomeado, você poderá transmitir o nomeado parâmetros para IDispatch::Invoke em qualquer ordem.

De exemplo, se um método deve ser chamado com dois parâmetros posicionais, seguido nomeado três parâmetros (A, B, e C), usando a seguinte sintaxe hipotético, em seguida, cArgs Seria 5, e cNamedArgs Seria 3.

O primeiro parâmetro posicional seria em rgvarg[4] .O segundo posicional parâmetro seria em rgvarg[3].

A ordem de nomeado parâmetros não é importante para o IDispatch implementação, mas esses parâmetros geralmente são passados em ordem inversa.

O parâmetro A Seria em rgvarg[2], com o DISPID de A Em rgdispidNamedArgs[2].

O parâmetro B Seria em rgvarg[1], com o correspondente DISPID em rgdispidNamedArgs[1].

O parâmetro C Seria em rgvarg[0], com o correspondente DISPID para C Em rgdispidNamedArgs[0].

Você também pode usar Chamar nos membros com opcional parâmetros, mas opcional todos os parâmetros devem ser do tipo Variant.

Como com exigido parâmetros, o conteúdo do vetor de parâmetro depende se os parâmetros são posicionais ou nomeado. O membro chamado deve garantir que os parâmetros estejam válido. Chamar Simplesmente passa a DISPPARAMS estrutura que recebe.

Omitindo nomeado parâmetros é simples. Você faria transmitir os parâmetros rgvarg e seus DISPIDs em rgdispidNamedArgs.

Para omitir o parâmetro nomeado B (Na acima exemplo) você definiria rgvarg[0] para o valor de C, com seu DISPID em rgdispidNamedArgs[0]; e rgvarg[1] para o valor de A, Com sua DISPID em rgdispidNamedArgs[1]. Os parâmetros subseqüentes posicionais seriam ocupam elementos 2 e 3 das matrizes. Neste maiúsculas e minúsculas, cArgs é 4 e cNamedArgs is 2.

Se os parâmetros eram posicional (sem nome), você poderia definir cArgs Para o número total de possíveis parâmetros, cNamedArgs para 0 e transmitir VT_ERROR como o tipo dos parâmetros omitidos, com a codificar status DISP_E_PARAMNOTFOUND como o valor.

A codificar chamado é responsável por liberar todas as seqüências de caracteres e objetos referenciados por rgvarg[] ou posicionado no *pVarResult.

Como com outros parâmetros que são passados por valor, se o membro chamado deve manter acessar a um seqüência de caracteres após retornar, você deve copiar a seqüência de caracteres. Da mesma forma, se o membro precisa acessar para um passado-ponteiro objeto após retornar, ele deve chamar o IUnknown::AddRef função sobre o objeto.

Um comum exemplo ocorre quando uma propriedade objeto é alterada para referir a um novo objeto, usando o sinalizador DISPATCH_PROPERTYPUTREF.

Para aqueles implementação Chamar, Automation fornece a DispGetParam função para recuperar parâmetros do parâmetro vetor e coagi-los para o tipo adequado.

See Also

Reference

DispGetParam
DISPPARAMS
IDispatch::Invoke
VARIANT and VARIANTARG
IUnknown::AddRef

Concepts

Automation