C \ C ++中主要功能的签名可以包括3个参数:
main( int argc, char *argv[ ], char *envp[ ] )
第三是环境变量。 我是根据VS10编译库,因此我没有
main()
。如何将环境变量与
char *envp[]
中完全相同的类型中的变量获取?我宁愿不使用.NET来减少依赖性,也许有一天对可移植性开放。
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};
if (not env_block) {
return env;
}
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
上。但是我很懒
usage就是这样:
environment_t env = get_env();
// Now you can write env[T("Var1")] to access a variable.
我不知道Windows,但是在Linux上此变量:
extern char **environ;
正是您想要的。
以下是基于@konrad的出色答案
,有2个主要区别:
使用TCHAR
。没有人应该在Windows中使用非宽字符。
使用
key
value
和
std::wstring str(buffer, buflen)
,如this Answer中所建议的。我相信表现应该比conch-char的表现更好,尽管我还没有测量它。
typedef std::map<std::wstring, std::wstring> environment_t;
environment_t get_env() {
environment_t env;
auto free = [](wchar_t* p) { FreeEnvironmentStrings(p); };
auto env_block = std::unique_ptr<wchar_t, decltype(free)>{
GetEnvironmentStringsW(), free};
for (const wchar_t* name = env_block.get(); *name != L'\0'; )
{
const wchar_t* equal = wcschr(name, L'=');
std::wstring key(name, equal - name);
const wchar_t* pValue = equal + 1;
std::wstring value(pValue);
env[key] = value;
name = pValue + value.length() + 1;
}
return env;
}
这是Konrad和Jonathan在此问题中的现有答案的一种变体,它可能会帮助任何想要创建单个WideChar字符串来记录的人或(在我的情况下)用于远程诊断。 请随意投票。
LPWCH we = GetEnvironmentStrings();
const wchar_t* w = we;
do {
eline = w;
w += eline.length() + 1;
env += eline;
env += L"\r\n";
} while ((eline.length() > 0) && (*w != L'\0'));
FreeEnvironmentStrings(we);