getenv_s
, _wgetenv_s
Obtient une valeur à partir de l'environnement actuel. Ces versions ont des améliorations de getenv
_wgetenv
sécurité, comme décrit dans les fonctionnalités de sécurité du CRT.
Important
Cette API ne peut pas être utilisée dans les applications qui s’exécutent dans le Windows Runtime. Pour plus d’informations, consultez Fonctions CRT non prises en charge dans les applications de la plateforme Windows universelle.
Syntaxe
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
Paramètres
pReturnValue
Taille de la mémoire tampon requise ou 0 si la variable n’est pas trouvée.
buffer
Mémoire tampon chargée de stocker la valeur de la variable d'environnement.
numberOfElements
Taille de la buffer
.
varname
Nom de la variable d'environnement.
Valeur retournée
Zéro en cas de réussite ; code d'erreur en cas d'échec.
Conditions d’erreur
pReturnValue |
buffer |
numberOfElements |
varname |
Valeur de retour |
---|---|---|---|---|
NULL |
n'importe laquelle | tous | tous | EINVAL |
n'importe laquelle | NULL |
>0 | n'importe laquelle | EINVAL |
tous | tous | n'importe laquelle | NULL |
EINVAL |
L’une de ces conditions d’erreur appelle un gestionnaire de paramètres non valide, comme décrit dans la validation des paramètres. Si l'exécution est autorisée à se poursuivre, les fonctions affectent à errno
la valeur EINVAL
et retournent EINVAL
.
De même, si la mémoire tampon est trop petite, ces fonctions retournent ERANGE
. Ils n’appellent pas de gestionnaire de paramètres non valide. Elles écrivent la taille de mémoire tampon nécessaire dans pReturnValue
et permettent ainsi aux programmes de rappeler la fonction avec une mémoire tampon plus grande.
Notes
La fonction getenv_s
recherche varname
dans la liste des variables d'environnement. getenv_s
ne respecte pas la casse dans le système d’exploitation Windows. getenv_s
et _putenv_s
utilisent la copie de l'environnement vers laquelle pointe la variable globale _environ
pour accéder à l'environnement. getenv_s
fonctionne uniquement sur les structures de données accessibles à la bibliothèque Runtime et non sur l'environnement « segment » que crée le système d'exploitation pour le processus. Par conséquent, les programmes qui utilisent l’argument envp
ou main
wmain
peuvent récupérer des informations non valides.
_wgetenv_s
est une version à caractères larges de getenv_s
; l'argument et la valeur de retour de _wgetenv_s
sont des chaînes à caractères larges. La variable globale _wenviron
est une version à caractères larges de _environ
.
Dans un programme MBCS (par exemple, un programme ASCII SBSC), la valeur initiale de _wenviron
est NULL
, car l'environnement se compose de chaînes de caractères multioctets. Ensuite, au premier appel à _wputenv
ou _wgetenv_s
, s'il existe déjà un environnement (MBCS), un environnement à chaînes de caractères larges correspondant est créé, puis désigné par _wenviron
.
De la même manière, dans un programme Unicode(_wmain
), la valeur initiale de _environ
est NULL
, car l’environnement se compose de chaînes de caractères larges. Ensuite, au premier appel à _putenv
ou getenv_s
, s'il existe déjà un environnement (Unicode), un environnement MBCS correspondant est créé, puis désigné par _environ
.
Lorsque deux copies de l’environnement (MBCS et Unicode) existent simultanément dans un programme, l’exécution peut prendre plus de temps, car le système d’exécution doit conserver les deux copies. Par exemple, quand vous appelez _putenv
, un appel à _wputenv
est aussi exécutée automatiquement, de sorte que les deux chaînes d'environnement correspondent.
Attention
Dans de rares cas, quand le système Runtime gère une version Unicode et une version multioctet de l'environnement, il se peut que les deux versions d'environnement ne correspondent pas exactement. En effet, même si une chaîne de caractères multioctets unique est mappée à une chaîne Unicode unique, le mappage d'une chaîne Unicode unique à une chaîne de caractères multioctets n'est pas nécessairement unique. Pour plus d’informations, consultez _environ
, _wenviron
.
Remarque
Les familles de fonctions _putenv_s
et _getenv_s
ne sont pas thread-safe. _getenv_s
peut retourner un pointeur de chaîne pendant que _putenv_s
modifie la chaîne, ce qui provoque par voie de conséquence des échecs aléatoires. Assurez-vous que les appels à ces fonctions sont synchronisés.
En C++, l’utilisation de ces fonctions est simplifiée par les surcharges de modèle ; les surcharges peuvent déduire automatiquement la longueur de la mémoire tampon, ce qui évite ainsi d’avoir à spécifier un argument de taille. Pour plus d'informations, consultez Sécuriser les surcharges de modèle.
Par défaut, l’état global de cette fonction est limité à l’application. Pour modifier ce comportement, consultez État global dans le CRT.
Mappages de routines de texte générique
Routine TCHAR.H |
_UNICODE et _MBCS non définis |
_MBCS défini |
_UNICODE défini |
---|---|---|---|
_tgetenv_s |
getenv_s |
getenv_s |
_wgetenv_s |
Pour vérifier ou modifier la valeur de la variable d'environnement TZ
, utilisez getenv_s
, _putenv
et _tzset
, selon les besoins. Pour plus d’informations sur TZ
, voir _tzset
et _dstbias
_daylight
, , _timezone
et ._tzname
Spécifications
Routine | En-tête requis |
---|---|
getenv_s |
<stdlib.h> |
_wgetenv_s |
<stdlib.h> ou <wchar.h> |
Pour plus d’informations sur la compatibilité, consultez Compatibility.
Exemple
// 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);
}
Original LIB variable is: c:\vctools\lib;c:\vctools\atlmfc\lib;c:\vctools\PlatformSDK\lib;c:\vctools\Visual Studio SDKs\DIA Sdk\lib;c:\vctools\Visual Studio SDKs\BSC Sdk\lib
New LIB variable is: c:\mylib;c:\yourlib
Voir aussi
Processus et contrôle d’environnement
Constantes environnementales
_putenv
, _wputenv
_dupenv_s
, _wdupenv_s