在Windows

问题描述 投票:0回答:3

C \ C ++中主要功能的签名可以包括3个参数:

main( int argc, char *argv[ ], char *envp[ ] )

第三是环境变量。 我是根据VS10编译库,因此我没有

main()

。如何将环境变量与

char *envp[]
中完全相同的类型中的变量获取?我宁愿不使用.NET来减少依赖性,也许有一天对可移植性开放。
	

c++ c environment-variables
3个回答
9
投票
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;
正是您想要的。


4
投票

以下是基于
@konrad的出色答案

,有2个主要区别:

使用

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);
    
        

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.