GUI程序获取方法:
void Ctest1Dlg::DumpEnvironmentStrings()
{
// 获取完整的环境块
PTSTR pEnvBlock = GetEnvironmentStrings();
// 将pEnvBlock变量的值备份到的pszCurrent中目的:
// a、用pEnvBlock释放该内存块。如果pEnvBlock的值被改变了,就没法释放该内存,因为找不到内存的起始地址
// b、用pszCurrent来遍历环境变量
PTSTR pszCurrent = pEnvBlock;
HRESULT hResult = S_OK;
PCTSTR pszPos = NULL;
int current = 0;
while (pszCurrent != NULL)
{
// 过滤掉不属于环境变量的字符串
// 为什么要用“=”来判断当前字符串是否是环境变量?
// 答:因为环境变量是以“变量名=变量值”形式存在的,不会以“=”开头,所以可以用这个办法来判断
if (*pszCurrent != _T('=')) // 打印环境变量
{
TRACE(pszCurrent);// 在调试窗口下可以看到打印出来的环境变量以及对应的值(格式为:变量名=变量值)
TRACE(_T("\r\n"));
}
else // 打印非环境变量
{
TRACE(pszCurrent);
TRACE(_T("\r\n"));
}
// 遍历下一个变量
++current;
// 移动到字符串的末尾
while (*pszCurrent != _T('\0'))
++pszCurrent;
++pszCurrent;
// 检查释放是最后的字符串
if (*pszCurrent == _T('\0'))
break;
}
// 释放环境块
FreeEnvironmentStrings(pEnvBlock);
}
CUI程序获取的方法:
#include "stdafx.h"
#include <stdlib.h>
#include <Windows.h>
void DumpEnvVariables(PTSTR pEnvBlock[])
{
PTSTR* pElement = (PTSTR*)pEnvBlock;
while (*pElement != NULL)
{
_tprintf(_T("%s\r\n"), *pElement);// 向控制台窗口输出环境变量(格式:变量名=变量值)
++pElement;
}
}
// 建立控制台程序是,编译器默认情况下只生成前两个参数,env参数是我手动添加的,
// 该参数存储的就是当前进程的环境变量,通过解析该变量的值,就可以得到环境变量的值
int _tmain(int argc, _TCHAR* argv[], TCHAR* env[])
{
DumpEnvVariables(env);
system("pause");
return 0;
}