Atributos de matriz y Sized-Pointer
MIDL proporciona un amplio conjunto de características para pasar matrices de datos y punteros a datos. Puede usar estos atributos para especificar características de matrices y varios niveles de punteros.
Atributo | Uso |
---|---|
size_is | Especifica la cantidad de memoria que se va a asignar para punteros de tamaño, punteros de tamaño a punteros de tamaño y matrices únicas o multidimensionales. |
max_is | Valor máximo de un índice de matriz. |
length_is | Número de elementos de matriz que se van a transmitir. |
first_is | Índice del primer elemento de matriz que se va a transmitir. |
last_is | Proporciona el índice del último elemento de matriz que se va a transmitir. |
string | Indica que la matriz de caracteres unidimensionales, wchar_t, byte (o equivalente) o el puntero a dicha matriz, se va a controlar como una cadena. |
Gama | Especifica un intervalo de valores permitidos para argumentos o campos cuyos valores se establecen en tiempo de ejecución. |
MIDL admite tres tipos de punteros: punteros de referencia, punteros únicos y punteros completos. Estos punteros se especifican mediante los atributos de puntero ref, unique y ptr.
Se puede aplicar un atributo de puntero como atributo de tipo; como atributo de campo que se aplica a un miembro de estructura, miembro de unión o parámetro; o como atributo de función que se aplica al tipo de valor devuelto de la función. El atributo de puntero también puede aparecer con la palabra clave pointer_default .
Para permitir que un parámetro de puntero cambie de valor durante una función remota, debe proporcionar otro nivel de direccionamiento indirecto proporcionando varios declaradores de puntero. El atributo de puntero explícito aplicado al parámetro afecta solo al declarador de puntero más a la derecha para el parámetro . Cuando hay varios declaradores de puntero en una declaración de parámetros, los demás declaradores tienen como valor predeterminado el atributo de puntero especificado por el atributo pointer_default . Para aplicar distintos atributos de puntero a varios declaradores de puntero, debe definir tipos intermedios que especifiquen los atributos de puntero explícitos.
Valores de Pointer-Attribute predeterminados
Cuando no hay ningún atributo de puntero asociado a un puntero que es un parámetro, se supone que el puntero es un puntero ref .
Cuando no hay ningún atributo de puntero asociado a un puntero que sea miembro de una estructura o unión, el compilador MIDL asigna atributos de puntero mediante las siguientes reglas de prioridad (1 es mayor):
- Atributos aplicados explícitamente al tipo de puntero
- Atributos aplicados explícitamente al parámetro o miembro del puntero
- Atributo pointer_default en el archivo IDL que define el tipo
- Atributo pointer_default en el archivo IDL que importa el tipo
- ptr (modo osf); unique (modo predeterminado rpc de Microsoft)
Cuando el archivo IDL se compila en modo predeterminado, los archivos importados pueden heredar atributos de puntero de los archivos de importación. Esta característica no está disponible cuando se compila mediante el modificador /osf . Para obtener más información, consulte importación.
Tipos devueltos de función
Un puntero devuelto por una función debe ser un puntero único o un puntero completo. El compilador MIDL notifica un error si un resultado de función es un puntero de referencia, ya sea explícita o de forma predeterminada. El puntero devuelto siempre indica un nuevo almacenamiento.
Las funciones que devuelven un valor de puntero pueden especificar un atributo de puntero como atributo de función. Si un atributo de puntero no está presente, el puntero de resultado de la función usa el valor proporcionado como atributo pointer_default .
Atributos de puntero en definiciones de tipos
Cuando se especifica un atributo de puntero en el nivel superior de una instrucción typedef , el atributo especificado se aplica al declarador de puntero, según lo previsto. Cuando no se especifica ningún atributo de puntero, los declaradores de puntero en el nivel superior de una instrucción typedef heredan el tipo de atributo de puntero cuando se usan.
DCE IDL no permite aplicar explícitamente el mismo atributo de puntero, por ejemplo, en la declaración typedef y en la lista de atributos de parámetros. Cuando se usa el modo predeterminado (extensiones de Microsoft) del compilador MIDL, esta restricción se relaja.
Para obtener una explicación sobre el uso de matrices y punteros MIDL en llamadas a procedimientos remotos, consulte Matrices y punteros.