Passing Parameters
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