getenv_s, _wgetenv_s
Obtiene un valor del entorno actual.Estas versiones de getenv, _wgetenv tienen mejoras de seguridad, como se describe en Características de seguridad en CRT.
Importante |
---|
Esta API no se puede utilizar en las aplicaciones que se ejecutan en Windows en tiempo de ejecución.Para obtener más información, vea Funciones CRT no compatibles con /ZW. |
errno_t getenv_s(
size_t *pReturnValue,
char* buffer,
size_t numberOfElements,
const char *varname
);
errno_t _wgetenv_s(
size_t *pReturnValue,
wchar_t *buffer,
size_t numberOfElements,
const wchar_t *varname
);
template <size_t size>
errno_t getenv_s(
size_t *pReturnValue,
char (&buffer)[size],
const char *varname
); // C++ only
template <size_t size>
errno_t _wgetenv_s(
size_t *pReturnValue,
wchar_t (&buffer)[size],
const wchar_t *varname
); // C++ only
Parámetros
pReturnValue
El tamaño de búfer que se requiere, o 0 si la variable no se encuentra.buffer
Búfer para almacenar el valor de la variable de entorno.numberOfElements
Tamaño de buffer.varname
Nombre de la variable de entorno.
Valor devuelto
Cero si correctamente; si no, un código de error del error.
Condiciones de error
pReturnValue |
buffer |
numberOfElements |
varname |
Valor devuelto |
---|---|---|---|---|
NULL |
any |
any |
any |
EINVAL |
any |
NULL |
>0 |
any |
EINVAL |
any |
any |
any |
NULL |
EINVAL |
Cualquiera de estas condiciones de error se invoca un controlador no válido de parámetro, tal y como se describe en Validación de parámetros.Si la ejecución puede continuar, errno establecido funciones a EINVAL y a EINVAL return.
Además, si el búfer es demasiado pequeño, estas funciones ERANGE return.No se invoca un controlador no válido del parámetro.Establece el tamaño de búfer en tipo necesario en pReturnValue, y por tanto permiten a los programas para llamar a la función de nuevo con un búfer mayor.
Comentarios
La función de getenv_s busca en la lista de variables de entorno para varname.getenv_s no distingue entre mayúsculas y minúsculas en el sistema operativo Windows.getenv_s y _putenv_s utilizan la copia del entorno que se está indicada por la variable global _environ para tener acceso al entorno.getenv_s sólo funciona en estructuras de datos que son accesibles a la biblioteca en tiempo de ejecución y no en el entorno “segmento” que se crea para el proceso por el sistema operativo.Por consiguiente, los programas que utilizan el argumento de envp a principal o a wmain puede recuperar la información no válida.
_wgetenv_s es una versión con caracteres anchos de getenv_s; el argumento y el valor devuelto de _wgetenv_s son cadenas de caracteres.La variable global de _wenviron es una versión con caracteres anchos de _environ.
En un programa de MBCS (por ejemplo, en un programa ASCII de SBCS), _wenviron inicialmente es NULL porque el entorno se compone de las cadenas de multibyte- carácter.A continuación, en la primera llamada a _wputenv, o en la primera llamada a _wgetenv_s, si existe un entorno (MBCS) ya, un entorno correspondiente de cadena de caracteres es creado y después indicada por _wenviron.
De igual forma en un programa de Unicode (_wmain), _environ inicialmente es NULL porque el entorno se compone de las cadenas de caracteres.A continuación, en la primera llamada a _putenv, o en la primera llamada a getenv_s si existe el entorno a (Unicode) ya, un entorno correspondiente de MBCS es creado y después indicada por _environ.
Cuando dos copias del entorno (MBCS y Unicode) simultáneamente en un programa, el sistema de runtime debe mantener ambas copias, y esto provoca un runtime más lento.Por ejemplo, cuando se llama a _putenv, una llamada a _wputenv también se ejecuta automáticamente de modo que las dos cadenas de entorno corresponden.
Precaución |
---|
Son raros, cuando el sistema en tiempo de ejecución mantiene una versión Unicode y una versión multibyte de entorno, las dos versiones del entorno pueden no corresponda exactamente.Esto sucede porque, aunque ninguna mapas única de la cadena de multibyte- carácter en una cadena Unicode única, la asignación de una cadena Unicode única de una cadena de multibyte- carácter no es necesariamente única.Para obtener más información, vea _environ, _wenviron. |
[!NOTA]
Familias de _putenv_s y de _getenv_s de funciones no son seguros para subprocesos._getenv_s podría devolver un puntero de cadena mientras _putenv_s está modificando los errores aleatorios de la cadena y por tanto de la causa.Asegúrese de que las llamadas a estas funciones están sincronizadas.
En C++, el uso de estas funciones es simplificado con sobrecargas de plantilla; las sobrecargas pueden deducir longitud de búfer automáticamente y por tanto eliminar la necesidad de especificar un argumento size.Para obtener más información, vea Sobrecargas de plantilla de seguridad.
Asignaciones de la rutina de Genérico- texto
Rutina de TCHAR.H |
_UNICODE y _MBCS no definidos |
_MBCS definido |
_UNICODE definido |
---|---|---|---|
_tgetenv_s |
getenv_s |
getenv_s |
_wgetenv_s |
Para comprobar o cambiar el valor de la variable de entorno TZ, utilice getenv_s, de _putenv, y de _tzset, según sea necesario.Para obtener más información acerca de TZ, vea _tzset y _daylight, _dstbias, _timezone, y _tzname.
Requisitos
Rutina |
Encabezado necesario |
---|---|
getenv_s |
<stdlib.h> |
_wgetenv_s |
<stdlib.h> o <wchar.h> |
Para obtener información adicional de compatibilidad, vea Compatibilidad.
Ejemplo
// crt_getenv_s.c
// This program uses getenv_s to retrieve
// the LIB environment variable and then uses
// _putenv to change it to a new value.
#include <stdlib.h>
#include <stdio.h>
int main( void )
{
char* libvar;
size_t requiredSize;
getenv_s( &requiredSize, NULL, 0, "LIB");
if (requiredSize == 0)
{
printf("LIB doesn't exist!\n");
exit(1);
}
libvar = (char*) malloc(requiredSize * sizeof(char));
if (!libvar)
{
printf("Failed to allocate memory!\n");
exit(1);
}
// Get the value of the LIB environment variable.
getenv_s( &requiredSize, libvar, requiredSize, "LIB" );
printf( "Original LIB variable is: %s\n", libvar );
// Attempt to change path. Note that this only affects
// the environment variable of the current process. The command
// processor's environment is not changed.
_putenv_s( "LIB", "c:\\mylib;c:\\yourlib" );
getenv_s( &requiredSize, NULL, 0, "LIB");
libvar = (char*) realloc(libvar, requiredSize * sizeof(char));
if (!libvar)
{
printf("Failed to allocate memory!\n");
exit(1);
}
// Get the new value of the LIB environment variable.
getenv_s( &requiredSize, libvar, requiredSize, "LIB" );
printf( "New LIB variable is: %s\n", libvar );
free(libvar);
}
Equivalente en .NET Framework
System::Environment::GetEnvironmentVariable