Partager via


getenv_s, _wgetenv_s

Obtient le à partir de l'environnement de design. Ces versions getenv, _wgetenv présentent des améliorations de sécurité, comme décrit dans Fonctionnalités de sécurité dans le 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 avec /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

Paramètres

  • pReturnValue
    La taille de mémoire tampon requise, ou 0 si la variable est introuvable.

  • buffer
    Mémoire tampon pour stocker la valeur de la variable d'environnement.

  • numberOfElements
    Taille du buffer.

  • varname
    nom de la variable d'environnement

Valeur de retour

Zéro si l'opération a réussi ; un code d'erreur en cas de échec.

Conditions d'erreur

pReturnValue

buffer

numberOfElements

varname

Valeur de retour

NULL

any

any

any

EINVAL

any

NULL

>0

any

EINVAL

any

any

any

NULL

EINVAL

L'une de ces conditions d'erreur appelle un gestionnaire de paramètre non valide, comme décrit dans Validation de paramètre. Si l'exécution est autorisée à se poursuivre, les fonctions définissent errno avec la valeur EINVAL et retournent EINVAL.

En outre, si la mémoire tampon est trop petite, ces fonctions retournentERANGE. Ils n'appelle pas de gestionnaire de paramètre non valide. Ils écrivent la taille de mémoire tampon requise dans pReturnValue, et permettant ainsi aux programmes d'appeler la fonction de nouveau avec une taille de 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 auquel la variable globale _environ pointe pour accéder à l'environnement. getenv_s fonctionne uniquement sur les structures de données accessibles à la bibliothèque Runtime et non sur le "segment" d'environnement créé pour le processus par le système d'exploitation. Par conséquent, les programmes qui utilisent l'argument envp pour main ou 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 de caractères larges. La variable globale _wenviron est une version à caractère élargi de _environ.

Dans un programme MBCS (par exemple, dans un programme ASCII SBCS), _wenviron est initialement NULL parce que l'environnement est composé des chaînes de caractères multioctets. Ensuite, au premier appel de _wputenv, ou de _wgetenv_s si un environnement (MBCS) existe déjà, l'environnement de chaîne à caractère élargi correspondant est créé, et _wenviron pointe vers lui.

De même dans un programme Unicode ((_wmain), _environ est initialement NULL parce que l'environnement est composé des chaînes à caractère élargi. Ensuite, au premier appel de _putenv, ou de getenv_s si un environnement (Unicode) existe déjà, un environnement MBCS correspondant est créé, et _environ pointe vers lui.

Lorsque deux copies de l'environnement (MBCS et Unicode) existent simultanément dans un programme, le système runtime doit conserver les deux copies, ce qui entraîne une durée d'exécution plus lente. Par exemple, lorsque vous appelez _putenv, un appel à _wputenv est exécuté automatiquement, afin que les deux chaînes d'environnement correspondent.

Avertissement

Dans quelques cas rares, lorsque le système runtime conserve une version Unicode et une version multioctets de l'environnement, ces versions de deux environnements peuvent ne pas correspondre exactement.En effet, bien que toute chaîne multioctets mappe à une seule chaîne Unicode, le mappage d'une seule chaîne Unicode en une chaîne de caractères multioctets n'est pas nécessairement unique.Pour plus d'informations, consultez _environ, _wenviron.

Notes

Les familles de fonctions _putenv_s et _getenv_s ne sont pas sécurisées du point de vue du thread._getenv_s peut retourner un pointeur de chaîne alors que _putenv_s modifie la chaîne, provoquant des défaillances aléatoires.Assurez-vous que les appels à ces fonctions sont synchronisés.

En C++, l'utilisation de ces fonctions est simplifiée par des surcharges de modèle ; les surcharges peuvent également déduire la longueur de la mémoire tampon automatiquement, en éliminant le besoin de spécifier un argument de taille. Pour plus d'informations, consultez Sécuriser les surcharges de modèle.

Mappages de routines de texte générique

Routine TCHAR.H

_UNICODE & _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 l'_tzset selon les besoins. Pour plus d'informations sur TZ, consultez _tzset et _daylight, _dstbias, _timezone, and _tzname.

Configuration requise

Routine

En-tête requis

getenv_s

<stdlib.h>

_wgetenv_s

<stdlib.h> ou <wchar.h>

Pour plus d'informations sur la compatibilité, consultez Compatibilité.

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);
}
  

Équivalent .NET Framework

System::Environment::GetEnvironmentVariable

Voir aussi

Référence

Contrôle de processus et d'environnement

Constantes d'environnement

_putenv, _wputenv

_dupenv_s, _wdupenv_s