进程的环境变量

来源:互联网 发布:蒙泰打印机端口设置 编辑:程序博客网 时间:2024/06/06 13:06
环境变量是进程中一组变量信息,环境变量分为系统环境变量、用户环境变量和进程环境变量。系统有全局的环境变量,在进程创建时,进程继承了系统的全局环境变量、当前登录用户的用户环境变量和父进程的环境变量。进程也可以有自己的环境变量。设置和获取所在进程的环境变量使用函数GetEnvironmentStrings、GetEnvironmentVariable和SetEnvironmentVariable:

1)GetEnvironmentStrings函数用于获取所有环境变量字符串:
LPTCH WINAPI GetEnvironmentStrings(void);
返回值:
成功时,返回指向保存环境变量的缓冲区;
失败时,返回值为NULL。
 
2)FreeEnvironmentStrings函数用来释放由GetEnvironmentStrings返回的内存块:
BOOL WINAPI FreeEnvironmentStrings(
  __in  LPTCH lpszEnvironmentBlock
);
返回值:
成功时,返回非零值;
失败时,返回零值,可调用GetLastError()查看进一步错误消息。
 
3)GetEnvironmentVariable函数用于获取指定的环境变量:
DWORD WINAPI GetEnvironmentVariable(
  __in_opt   LPCTSTR lpName, //环境变量名
  __out_opt  LPTSTR lpBuffer, //指向保存环境变量值的缓冲区
  __in       DWORD nSize //缓冲区大小(字符数)
);
返回值:
成功时,返回真实的环境变量值大小,不包括null结束符;
如果lpBuffer大小不足,则返回值是实际所需的字符数大小,lpBuffer内容未定义;
失败时,返回0;如果指定的环境变量找不到,GetLastError()返回ERROR_ENVVAR_NOT_FOUND。
 
4)SetEnvironmentVariable函数用于设置指定的环境变量:
BOOL WINAPI SetEnvironmentVariable(
  __in      LPCTSTR lpName, //环境变量名,当该值不存在且lpValue不为NULL时,将创建一个新的
  __in_opt  LPCTSTR lpValue //环境变量值
);
返回值:
成功时,返回非零值;
失败时,返回零值,调用GetLastError()查看具体的错误信息。

该函数对系统环境变量以及其他进程的环境变量不起作用!


// EnivronmentVariable.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "windows.h"#include "strsafe.h"void DumpEnvVariables(PTSTR pEnvBlock[])  {  int current = 0;  PTSTR* pElement = (PTSTR*)pEnvBlock;  PTSTR pCurrent = NULL;  while (pElement != NULL)  {  pCurrent = (PTSTR)(*pElement);  if (pCurrent == NULL)  {  // 没有更多环境变量了  pElement = NULL;  }  else  {  _tprintf(TEXT("[%u] %s\r\n"), current, pCurrent);  current++;  pElement++;  }  }  }  int _tmain(int argc, _TCHAR* argv[],TCHAR* env[]){/*1、获取完整的环境快PTSTR pEnvBlock = GetEnvironmentStrings();  PTSTR pszCurrent = pEnvBlock;  int current = 0;  while (pszCurrent != NULL)  {  // 不论是不是环境变量,暂且都打印  _tprintf(TEXT("[%u] %s\r\n"), current, pszCurrent);  current++;  // 指针移动到字符串末尾  while (*pszCurrent != TEXT('\0'))  pszCurrent++;  pszCurrent++;  // 是否是最后一个字符串  if (*pszCurrent == TEXT('\0'))  break;  }  // 释放内存  FreeEnvironmentStrings(pEnvBlock); *//*2、去除无意义的串PTSTR pEnvBlock = GetEnvironmentStrings();  TCHAR szName[MAX_PATH];  TCHAR szValue[MAX_PATH];  PTSTR pszCurrent = pEnvBlock;  HRESULT hr = S_OK;  PCTSTR pszPos = NULL;  int current = 0;  while (pszCurrent != NULL)  {  // 去除无意义的串(以'='开头,如"=::=::\","=C:=C:Windows\System32")  if (*pszCurrent != TEXT('='))  {  // 查找'=',然后指针指向'='后一个字符,即值的第一个字符  pszPos = _tcschr(pszCurrent, TEXT('='));  pszPos++;  // 将变量名拷贝到szName  size_t cbNameLength = (size_t)pszPos - (size_t)pszCurrent - sizeof(TCHAR);  hr = StringCbCopyN(szName, MAX_PATH, pszCurrent, cbNameLength);  if (FAILED(hr)) {  break;  }  // 获取值  hr = StringCchCopyN(szValue, MAX_PATH, pszPos, _tcslen(pszPos)+1);  if (SUCCEEDED(hr)) {  _tprintf(TEXT("[%u] %s=%s\r\n"), current, szName, szValue);  }  else if (hr == STRSAFE_E_INSUFFICIENT_BUFFER){  // 发生错误,检查截断  _tprintf(TEXT("[%u] %s=%s...\r\n"), current, szName, szValue);  }  else {  // 这里应该不能发生  _tprintf(TEXT("[%u] %s=???\r\n"), current, szName);  break;  }  }  else {  _tprintf(TEXT("[%u] %s\r\n"), current, pszCurrent);  }  current++;  // 指针移动到字符串末尾  while (*pszCurrent != TEXT('\0'))  pszCurrent++;  pszCurrent++;  // 是否是最后一个字符串  if (*pszCurrent == TEXT('\0'))  break;  }  // 释放内存  FreeEnvironmentStrings(pEnvBlock);  *//*通过main()函数的入口点参数获取环境变量DumpEnvVariables(env/*_wenviron*/);      */system("pause");return 0;}