GetEnvironmentStrings
возвращает (только для чтения!) Указатель на начало блока среды для процесса.
Блок представляет собой непрерывную строку в стиле C, которая содержит нольопределено key=value
пар.Блок завершается дополнительным нулевым завершением.
Чтобы сделать доступ более удобным, используйте что-то вроде следующей функции:
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;
}
Конечно, правильная реализация будет инкапсулировать это в классеи, вероятно, используйте std::stringstream
вместо ручной итерации по символам, объединяя строки в char
одновременно.Но я ленивый.
Использование такое:
environment_t env = get_env();
// Now you can write env[T("Var1")] to access a variable.