Windows核心编程学习五:进程的环境变量

来源:互联网 发布:如何经营好淘宝店铺 编辑:程序博客网 时间:2024/05/17 04:58

转载自:http://blog.csdn.net/guzhou_diaoke/article/details/8828608


注:源码为学习《Windows核心编程》的一些尝试,非原创。若能有助于一二访客,幸甚。


1.进程的环境变量

每个进程都有一个与它关联的环境块(environment block),这是在进程地址空间内分配的一块内存,其中包含字符串类似于:

=::=::\...

VarName=VarValue\0...

\0

除第一个=::=::\外,块中可能还有其他字符串是以等号开头的,这种字符串不作为环境变量使用。

访问环境块的两种方式:

1)调用GetEnvironmentStrings获取完整的环境块

2)CUI程序专用,通过应用程序main入口点函数所接收的TCHAR* env[]参数来实现


2.调用GetEnvironmentStrings获取完整的环境块

1)不论是不是环境变量,暂且都打印出来

[cpp] view plaincopyprint?
  1. void DumpEnvStrings()  
  2. {  
  3.     PTSTR pEnvBlock = GetEnvironmentStrings();  
  4.   
  5.     PTSTR pszCurrent = pEnvBlock;  
  6.     int current = 0;  
  7.   
  8.     while (pszCurrent != NULL)  
  9.     {  
  10.         // 不论是不是环境变量,暂且都打印  
  11.         _tprintf(TEXT("[%u] %s\r\n"), current, pszCurrent);  
  12.   
  13.         current++;  
  14.   
  15.         // 指针移动到字符串末尾  
  16.         while (*pszCurrent != TEXT('\0'))  
  17.             pszCurrent++;  
  18.         pszCurrent++;  
  19.   
  20.         // 是否是最后一个字符串  
  21.         if (*pszCurrent == TEXT('\0'))  
  22.             break;  
  23.     }  
  24.   
  25.     // 释放内存  
  26.     FreeEnvironmentStrings(pEnvBlock);  
  27. }  


2)去除无意义的串

[cpp] view plaincopyprint?
  1. void DumpEnvStrings()  
  2. {  
  3.     PTSTR pEnvBlock = GetEnvironmentStrings();  
  4.       
  5.     TCHAR szName[MAX_PATH];  
  6.     TCHAR szValue[MAX_PATH];  
  7.     PTSTR pszCurrent = pEnvBlock;  
  8.     HRESULT hr = S_OK;  
  9.     PCTSTR pszPos = NULL;  
  10.     int current = 0;  
  11.   
  12.     while (pszCurrent != NULL)  
  13.     {  
  14.         // 去除无意义的串(以'='开头,如"=::=::\","=C:=C:Windows\System32")  
  15.         if (*pszCurrent != TEXT('='))  
  16.         {  
  17.             // 查找'=',然后指针指向'='后一个字符,即值的第一个字符  
  18.             pszPos = _tcschr(pszCurrent, TEXT('='));  
  19.             pszPos++;  
  20.   
  21.             // 将变量名拷贝到szName  
  22.             size_t cbNameLength = (size_t)pszPos - (size_t)pszCurrent - sizeof(TCHAR);  
  23.             hr = StringCbCopyN(szName, MAX_PATH, pszCurrent, cbNameLength);  
  24.             if (FAILED(hr)) {  
  25.                 break;  
  26.             }  
  27.   
  28.             // 获取值  
  29.             hr = StringCbCopyN(szValue, MAX_PATH, pszPos, _tcslen(pszPos)+1);  
  30.             if (SUCCEEDED(hr)) {  
  31.                 _tprintf(TEXT("[%u] %s=%s\r\n"), current, szName, szValue);  
  32.             }  
  33.             else if (hr == STRSAFE_E_INSUFFICIENT_BUFFER){  
  34.                 // 发生错误,检查截断  
  35.                 _tprintf(TEXT("[%u] %s=%s...\r\n"), current, szName, szValue);  
  36.             }  
  37.             else {  
  38.                 // 这里应该不能发生  
  39.                 _tprintf(TEXT("[%u] %s=???\r\n"), current, szName);  
  40.                 break;  
  41.             }  
  42.         }  
  43.         else {  
  44.             _tprintf(TEXT("[%u] %s\r\n"), current, pszCurrent);  
  45.         }  
  46.   
  47.         current++;  
  48.   
  49.         // 指针移动到字符串末尾  
  50.         while (*pszCurrent != TEXT('\0'))  
  51.             pszCurrent++;  
  52.         pszCurrent++;  
  53.   
  54.         // 是否是最后一个字符串  
  55.         if (*pszCurrent == TEXT('\0'))  
  56.             break;  
  57.     }  
  58.   
  59.     // 释放内存  
  60.     FreeEnvironmentStrings(pEnvBlock);  
  61. }  



3.通过应用程序main入口点函数所接收的TCHAR* env[]参数来实现

[cpp] view plaincopyprint?
  1. void DumpEnvVariables(PTSTR pEnvBlock[])  
  2. {  
  3.     int current = 0;  
  4.     PTSTR* pElement = (PTSTR*)pEnvBlock;  
  5.     PTSTR pCurrent = NULL;  
  6.     while (pElement != NULL)  
  7.     {  
  8.         pCurrent = (PTSTR)(*pElement);  
  9.         if (pCurrent == NULL)  
  10.         {  
  11.             // 没有更多环境变量了  
  12.             pElement = NULL;  
  13.         }  
  14.         else  
  15.         {  
  16.             _tprintf(TEXT("[%u] %s\r\n"), current, pCurrent);  
  17.             current++;  
  18.             pElement++;  
  19.         }  
  20.     }  
  21. }  
  22.   
  23. int _tmain()  
  24. {  
  25.     DumpEnvVariables(_wenviron);  
  26.     return 0;  
  27. }