Share via


_environ, _wenviron

La variable _environ est un pointeur vers un tableau de pointeurs sur les chaînes de caractères multi-octets qui constituent l'environnement de processus. Cette variable globale a été déconseillée pour les versions fonctionnelles plus sécurisées getenv_s, _wgetenv_s et_putenv_s, _wputenv_s, qui doivent être utilisées à la place de la variable globale. _environ est déclaré dans Stdlib.h.

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.

extern char **_environ;

Notes

Dans un programme qui utilise la fonction main, _environ est lancé au démarrage du programme en fonction des paramètres pris dans l'environnement du système d'exploitation. L'environnement se compose d'une ou plusieurs entrées de la forme

ENVVARNAME=string

getenv_s et putenv_s utilisent la variable _environ pour accéder et modifier la table d'environnement. Lorsque _putenv est appelé pour ajouter ou supprimer des paramètres d'environnement, la table d'environnement change de taille. Son emplacement en mémoire peut également changer, en fonction de les besoins en mémoire du programme. La valeur de _environ est automatiquement analysée en conséquence.

La variable _wenviron, déclarée dans Stdlib.h comme suit :

extern wchar_t **_wenviron;

est une version à caractère élargi de _environ. Dans un programme qui utilise la fonction wmain, _wenviron est lancé au démarrage du programme en fonction des paramètres pris dans l'environnement du système d'exploitation.

Dans un programme qui utilise main, _wenviron est initialement NULL car l'environnement est composé de chaînes de caractères multi-octets. Lors du premier appel à _wgetenv ou à _wputenv, un environnement correspondant de chaîne de caractères larges est créé et est référencé par _wenviron.

De même dans un programme qui utilise wmain, _environ est initialement NULL parce que l'environnement est composé des chaînes à caractère élargi. Lors du premier appel à _getenv ou à _putenv, un environnement correspondant de chaîne de caractères multioctets est créé et est référencé par _environ.

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înerait 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 qu'aucune unique carte de chaînes multioctets à 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.Par conséquent, deux chaînes Unicode distinctes peuvent correspondre à la même chaîne multioctets.

L'interrogation de _environ dans un contexte Unicode est sans signification lorsque la liaison /MD ou /MDd est utilisée. Pour le CRT DLL, le type (large ou multioctets) du programme est inconnu. Seul le type multioctets est créé car il s'agit du scénario le plus probable.

Le pseudo-code suivant illustre comment cela peut se produire.

int i, j;
i = _wputenv( "env_var_x=string1" );  // results in the implicit call:
                                      // putenv ("env_var_z=string1")
j = _wputenv( "env_var_y=string2" );  // also results in implicit call:
                                      // putenv("env_var_z=string2")

Dans la notation utilisée pour cet exemple, les chaînes de caractères ne sont pas des littéraux de chaîne C ; en revanche, elles sont des espaces réservés qui représentent des littéraux de chaîne d'environnement Unicode dans l'appel à _wputenv et de chaînes d'environnement multioctets dans l'appel à putenv. Les espaces réservés 'x' et 'y' de caractère entre les deux chaînes distinctes d'environnement Unicode ne correspondent pas uniquement aux caractères dans le MBCS actuel. Au lieu de cela, les deux sont mappés à un caractère MBCS 'z' qui résulte de la tentative de convertir les chaînes.

Par conséquent, dans l'environnement multioctets, la valeur de « env_var_z » après le premier appel implicite à putenv est « string1 », mais cette valeur est remplacée sur le deuxième appel implicite à putenv, lorsque la valeur « env_var_z » est affectée à la valeur « string2 ». L'environnement Unicode (dans _wenviron) et l'environnement multioctets (dans _environ) diffèrent donc après cette série d'appels.

Voir aussi

Référence

Variables globales

getenv, _wgetenv

getenv_s, _wgetenv_s

_putenv, _wputenv

_putenv_s, _wputenv_s