GetEnvironmentStrings
devuelve un puntero (de solo lectura) al inicio del bloque de entorno para un proceso.
El bloque es una cadena de estilo C contigua que contiene key=value
pares terminados en nulo. El bloque termina con una terminación nula adicional.
para hacer el acceso más conveniente, utilizar algo como la siguiente función:
typedef std::basic_string<TCHAR> tstring; // Generally convenient
typedef std::map<tstring, tstring> environment_t;
environment_t get_env() {
environment_t env;
auto free = [](LPTCH p) { FreeEnvironmentStrings(p); };
auto env_block = std::unique_ptr<TCHAR, decltype(free)>{
GetEnvironmentStrings(), free};
for (LPTCH i = env_block.get(); *i != T('\0'); ++i) {
tstring key;
tstring value;
for (; *i != T('='); ++i)
key += *i;
++i;
for (; *i != T('\0'); ++i)
value += *i;
env[key] = value;
}
return env;
}
Por supuesto, una aplicación adecuada sería encapsular esto en una clase, y probablemente utilice std::stringstream
en lugar de iterar manualmente a través de los personajes, la concatenación las cadenas en char
a la vez. Pero soy flojo.
El uso es la siguiente:
environment_t env = get_env();
// Now you can write env[T("Var1")] to access a variable.
getenv() y setenv() no se pueden utilizar porque quiere conocer la lista entera ... pero si usted está utilizando Visual Studio entonces desarrollar aplicaciones para Windows, Entonces, ¿qué pasa con http://msdn.microsoft.com/en-us/library/ms683187%28v=vs.85%29.aspx? – Benoit
Relacionados: http://stackoverflow.com/questions/2692855/extern-c-char-environ-windows-c-cli (posiblemente incluso un dupe) – Flexo
Sugiero que no intente escribir archivos fuente en varios idiomas. – pmg