基本概念
GetEnvironmentStrings和FreeEnvironmentStrings是Windows API中成对使用的环境变量操作函数:前者用于获取当前进程的「所有环境变量完整缓冲区」,后者用于释放该缓冲区,核心是实现「安全遍历所有环境变量」并避免内存泄漏。
GetEnvironmentStrings:分配一块内存,存储当前进程的所有环境变量(格式:NULL分隔的字符串列表,结尾双NULL终止),返回缓冲区指针。
FreeEnvironmentStrings:释放GetEnvironmentStrings分配的缓冲区,回收系统资源。
强制规则:
仅GetEnvironmentStrings分配的缓冲区,能通过FreeEnvironmentStrings释放(不可释放malloc/LocalAlloc等手动分配的内存);
缓冲区需「分配一次 + 释放一次」,重复释放会导致内存损坏,不释放会导致资源泄漏;
释放后,原缓冲区指针失效,不可再访问(避免野指针操作)。
基本语法
1 2 3 4 5 6 7 8 9 10 11 12 13
|
LPWSTR GetEnvironmentStringsW();
LPTCH GetEnvironmentStringsA();
BOOL FreeEnvironmentStringsW(LPWCH lpszEnvironmentBlock);
BOOL FreeEnvironmentStringsA(LPTCH lpszEnvironmentBlock);
|
环境变量缓冲区格式
GetEnvironmentStringsW返回的缓冲区是连续内存块,格式规则:
1.每个环境变量以Unicode字符串存储(如L"PATH=C:\\Windows\\system32");
2.变量之间以单个\0(空字符)分隔;
3.整个缓冲区以两个连续\0结尾(遍历终止条件);
4.部分系统环境变量可能以=开头(如L"=C:=C:\\Windows"),表示驱动器当前目录,属于正常格式。
示例:
1 2 3 4
| L"ALLUSERSPROFILE=C:\\ProgramData\0" L"APPDATA=C:\\Users\\XXX\\AppData\\Roaming\0" L"PATH=C:\\Windows\\system32;...\0" L"\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
| #include <windows.h> #include <stdio.h> #include <wchar.h>
int main() { LPWSTR lpEnvBlock = GetEnvironmentStringsW(); if (lpEnvBlock == NULL) { printf("GetEnvironmentStringsW 失败,错误码:%d\n", GetLastError()); return 1; }
LPWSTR lpCurrent = lpEnvBlock; printf("当前进程的所有环境变量(Unicode):\n"); printf("-------------------------------------------------------------------------\n");
int nCount = 0; while (*lpCurrent != L'\0') { wprintf(L"[%d] %ls\n", ++nCount, lpCurrent); lpCurrent += wcslen(lpCurrent) + 1; }
printf("-------------------------------------------------------------------------\n"); printf("共找到 %d 个环境变量\n", nCount);
BOOL bResult = FreeEnvironmentStringsW(lpEnvBlock); if (bResult) { printf("缓冲区释放成功\n"); } else { printf("缓冲区释放失败,错误码:%d\n", GetLastError()); } lpEnvBlock = NULL;
return 0; }
|