Partilhar via


Atributos de matriz e Sized-Pointer

O MIDL fornece um rico conjunto de recursos para passar matrizes de dados e ponteiros para dados. Você pode usar esses atributos para especificar características de matrizes e vários níveis de ponteiros.

Atributo Utilização
size_is Especifica a quantidade de memória a ser alocada para ponteiros de tamanho, ponteiros de tamanho para ponteiros de tamanho e matrizes unidimensionais ou multidimensionais.
max_is O valor máximo para um índice de matriz.
length_is O número de elementos de matriz a serem transmitidos.
first_is O índice do primeiro elemento de matriz a ser transmitido.
last_is Fornece o índice do último elemento de matriz a ser transmitido.
string Indica que a matriz unidimensional char, wchar_t, byte (ou equivalente), ou o ponteiro para tal matriz, deve ser tratada como uma cadeia de caracteres.
gama Especifica um intervalo de valores permitidos para argumentos ou campos cujos valores são definidos em tempo de execução.

 

O MIDL suporta três tipos de ponteiros: ponteiros de referência, ponteiros exclusivos e ponteiros completos. Esses ponteiros são especificados pelos atributos de ponteiro ref, exclusivo e ptr.

Um atributo de ponteiro pode ser aplicado como um atributo type; como um atributo de campo que se aplica a um membro da estrutura, membro da união ou parâmetro; ou como um atributo de função que se aplica ao tipo de retorno de função. O atributo de ponteiro também pode aparecer com a palavra-chave pointer_default.

Para permitir que um parâmetro de ponteiro mude de valor durante uma função remota, você deve fornecer outro nível de indireção fornecendo vários declaradores de ponteiro. O atributo de ponteiro explícito aplicado ao parâmetro afeta apenas o declarador de ponteiro mais à direita para o parâmetro. Quando há vários declaradores de ponteiro em uma declaração de parâmetro, os outros declaradores usam como padrão o atributo de ponteiro especificado pelo atributo pointer_default. Para aplicar atributos de ponteiro diferentes a vários declaradores de ponteiro, você deve definir tipos intermediários que especifiquem os atributos de ponteiro explícitos.

Valores de Pointer-Attribute padrão

Quando nenhum atributo de ponteiro é associado a um ponteiro que é um parâmetro, o ponteiro é assumido como um ponteiro ref.

Quando nenhum atributo de ponteiro é associado a um ponteiro que é membro de uma estrutura ou união, o compilador MIDL atribui atributos de ponteiro usando as seguintes regras de prioridade (1 é o mais alto):

  1. Atributos explicitamente aplicados ao tipo de ponteiro
  2. Atributos explicitamente aplicados ao parâmetro ou membro do ponteiro
  3. O atributo pointer_default no arquivo IDL que define o tipo
  4. O atributo pointer_default no arquivo IDL que importa o tipo
  5. ptr (modo OSF); exclusivo (modo padrão Microsoft RPC)

Quando o arquivo IDL é compilado no modo padrão, os arquivos importados podem herdar atributos de ponteiro da importação de arquivos. Este recurso não está disponível quando você compila usando a opção deosf /. Para obter mais informações, consulte importar.

Tipos de retorno de função

Um ponteiro retornado por uma função deve ser um ponteiroexclusivoou um ponteiro completo. O compilador MIDL relata um erro se um resultado de função for um ponteiro de referência, explicitamente ou por padrão. O ponteiro retornado sempre indica novo armazenamento.

As funções que retornam um valor de ponteiro podem especificar um atributo de ponteiro como um atributo de função. Se um atributo de ponteiro não estiver presente, o ponteiro função-resultado usará o valor fornecido como o atributo pointer_default.

Atributos de ponteiro em definições de tipo

Quando você especifica um atributo de ponteiro no nível superior de uma instruçãotypedef, o atributo especificado é aplicado ao declarador de ponteiro, conforme o esperado. Quando nenhum atributo de ponteiro é especificado, os declaradores de ponteiro no nível superior de uma instrução typedef herdam o tipo de atributo de ponteiro quando usado.

O DCE IDL não permite que o mesmo atributo de ponteiro seja explicitamente aplicado duas vezes — por exemplo, na declaração typedef e na lista de atributos de parâmetro. Quando você usa o modo padrão (extensões da Microsoft) do compilador MIDL, essa restrição é relaxada.

Para obter uma discussão sobre o uso de matrizes e ponteiros MIDL em chamadas de procedimento remoto, consulte Arrays and Pointers.