GetEnvironmentStrings
zwraca wskaźnik (tylko do odczytu!) Na początek bloku środowiska dla procesu.
Blok jest ciągłym ciągiem w stylu C, który zawiera pary zakończone znakiem NUL key=value
. Blok kończy się dodatkowym zakończeniem zerowym.
Aby uzyskać dostęp do bardziej wygodne, używać coś jak następujących funkcji:
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;
}
oczywiście właściwa realizacja będzie hermetyzacji to w klasie, a prawdopodobnie używać std::stringstream
zamiast ręcznie iteracja ciągu znaków, łącząc ciągi na char
na raz. Ale jestem leniwy.
Wykorzystanie jest tak:
environment_t env = get_env();
// Now you can write env[T("Var1")] to access a variable.
getenv() i setenv() nie może być stosowany, ponieważ chcesz poznać całą listę ... ale jeśli używasz Visual Studio następnie rozwijać aplikację dla Windows, więc co z http://msdn.microsoft.com/en-us/library/ms683187%28v=vs.85%29.aspx? – Benoit
Powiązane: http://stackoverflow.com/questions/2692855/extern-c-char-environ-windows-c-cli (być może nawet duplikat) – Flexo
Sugeruję, że nie próbuj pisać wielojęzycznych plików źródłowych. – pmg