基本概念

GetEnvironmentVariable属于Windows.h头文件,专门用于读取指定名称的环境变量值,可以替代ExpandEnvironmentStrings中 “被动解析环境变量” 的方式,主动获取单个环境变量的具体值,灵活性更高。

基本语法

1
2
3
4
5
6
7
8
9
10
11
DWORD GetEnvironmentVariableW(
[in, optional] LPCWSTR lpName,// 要读取的环境变量名
[out, optional] LPWSTR lpBuffer,// 接收变量值的目标缓冲区
[in] DWORD nSize // 目标缓冲区的大小(字节数)
);

DWORD GetEnvironmentVariableA(
[in, optional] LPCSTR lpName,
[out, optional] LPSTR lpBuffer,
[in] DWORD nSize
);

返回值
成功:返回复制到缓冲区的字符数(ANSI是字节数,Unicodewchar_t字符数),不包含终止符\0
失败:
返回0:表示指定的环境变量不存在(可通过GetLastError()验证,错误码为ERROR_ENVVAR_NOT_FOUND);
返回值> nSize:表示缓冲区太小,返回值为存储该变量值所需的最小字节数(包含\0)。

简单示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <Windows.h>
#include <wchar.h>

int main()
{
// 示例1:先获取所需缓冲区大小,再分配空间(最安全)
LPCWSTR szVarName = L"TEMP"; // 要读取的环境变量名
DWORD dwRequiredSize = 0;

// 第一步:传入NULL获取所需字节数(返回值是字符数,需转字节数)
dwRequiredSize = GetEnvironmentVariableW(szVarName, NULL, 0);
if (dwRequiredSize == 0)
{
DWORD dwError = GetLastError();
if (dwError == ERROR_ENVVAR_NOT_FOUND)
{
wprintf(L"环境变量 %s 不存在\n", szVarName);
}
else
{
wprintf(L"获取缓冲区大小失败,错误码:%d\n", dwError);
}
return 1;
}

// 第二步:分配缓冲区(字节数 = 字符数 * sizeof(wchar_t))
DWORD dwBufferSize = dwRequiredSize * sizeof(wchar_t);
wchar_t* szVarValue = new wchar_t[dwRequiredSize];
if (szVarValue == NULL)
{
wprintf(L"内存分配失败\n");
return 1;
}

// 第三步:读取环境变量值
DWORD dwResult = GetEnvironmentVariableW(szVarName, szVarValue, dwRequiredSize);
if (dwResult > 0 && dwResult < dwRequiredSize)
{
wprintf(L"环境变量 %s 的值:%s\n", szVarName, szVarValue);
}
else
{
wprintf(L"读取环境变量失败,返回值:%d\n", dwResult);
delete[] szVarValue;
return 1;
}

// 示例2:直接使用固定大小缓冲区(常用 MAX_PATH)
wchar_t szUserName[MAX_PATH] = { 0 };
dwResult = GetEnvironmentVariableW(L"USERNAME", szUserName, MAX_PATH);
if (dwResult > 0 && dwResult < MAX_PATH)
{
wprintf(L"\n环境变量 USERNAME 的值:%s\n", szUserName);
}
else if (dwResult == 0)
{
wprintf(L"\nUSERNAME 环境变量不存在\n");
}
else
{
wprintf(L"\n缓冲区不足,所需大小:%d 字符\n", dwResult);
}

// 示例3:读取不存在的环境变量
wchar_t szInvalidVar[MAX_PATH] = { 0 };
dwResult = GetEnvironmentVariableW(L"INVALID_VAR_NAME", szInvalidVar, MAX_PATH);
if (dwResult == 0 && GetLastError() == ERROR_ENVVAR_NOT_FOUND)
{
wprintf(L"\n环境变量 INVALID_VAR_NAME 不存在(验证失败场景)\n");
}

// 释放内存
delete[] szVarValue;
return 0;
}