設置和獲取所在進程的環境變量

轉載網址:http://hi.baidu.com/code_tin/item/244219505b567b9309be1796

設置和獲取所在進程的環境變量,使用API函數
GetEnvironmentStrings,GetEnvironmentVariable和SetEnvironmentVariable等.

1.GetEnvironmentStrings
GetEnvironmentStrings可以獲得所有環境變量字串,GetEnvironmentStrings函數無參數,
返回PVOID類型函數,指向保存環境變量的緩衝區,使用完成需由FreeEnvironmentStrings函數釋放.

2.GetEnvironmentVariable
獲取指定的環境變量
DWORD GetEnvironmentVaribale(
LPCTSTR lpName,
LPTSTR lpBuffer,
DWORD nSize
);
lpName是環境變量名,lpBuffer指向保存環境變量值的緩衝區,nSize是緩衝區大小,返回真實的環境變量值大小.

3.SetEnvironmentVariable
BOOL SetEnvironmentVariable(
LPCTSTR lpName,
LPCTSTR lpValue
);

EnumEnvironmentVariables和ChangeEnviromentVariables分別是顯示和設置進程的環境變量.


/* 頭文件 */
#include <windows.h>
#include <stdio.h>
#include "env.h"
/* 預定義 */
#define BUFSIZE 4096
/*************************************
* DWORD WINAPI EnumEnvironmentVariables()
* 功能 顯示進程的所有環境變量
**************************************/
DWORD WINAPI EnumEnvironmentVariables()
{
// 獲取環境變量
PVOID pEv = GetEnvironmentStrings();
LPSTR szEnvs;
// 顯示
for (szEnvs = (LPSTR) pEv; *szEnvs;) 

   printf("%s\n",szEnvs);
   while (*szEnvs++);
}
// 釋放
FreeEnvironmentStrings(pEv);
return 0;
}
/*************************************
* DWORD WINAPI ChangeEnviromentVariables(LPSTR szName, 
LPSTR szNewValue, 
DWORD dwFlag)
* 功能 改變環境變量
*
* 參數 LPSTR szName 需要改變的環境
*   LPSTR szNewValue 新的變量值
*   DWORD dwFlag 附加、重置還是清零,相關常量在env.h在定義
**************************************/
DWORD WINAPI ChangeEnviromentVariables(LPSTR szName, 
            LPSTR szNewValue, 
            DWORD dwFlag)
{
DWORD dwErr;
PVOID szVal;
DWORD dwReturn; 
DWORD dwNewValSize;
// 如果標誌爲附加則則先獲取,然後將szNewValue附加到末尾
if(dwFlag == VARIABLES_APPEND)
{
   dwNewValSize = lstrlen(szNewValue)+1; // 新變量值的大小
   // 分配內存
   szVal = HeapAlloc(GetProcessHeap(),0,BUFSIZE+dwNewValSize);
   // 獲取值
   dwReturn = GetEnvironmentVariable(szName,szVal,BUFSIZE);
   if(dwReturn == 0) // 出錯
   {
    dwErr = GetLastError();
    if( ERROR_ENVVAR_NOT_FOUND == dwErr )
    {
     printf("Environment variable %s does not exist.\n", szName);
    }
    else
    {
     printf("error: %d",dwErr);
    }
    return FALSE;
   }
   else if(BUFSIZE < dwReturn) // 緩衝區太小
   {
    szVal = (LPTSTR) HeapReAlloc(GetProcessHeap(), 0,szVal, dwReturn+dwNewValSize);
    if(NULL == szVal)
    {
     printf("Memory error\n");
     return FALSE;
    }
    dwReturn = GetEnvironmentVariable(szName, szVal, dwReturn);
    if(!dwReturn)
    {
     printf("GetEnvironmentVariable failed (%d)\n", GetLastError());
     return FALSE;
    }
   }
   lstrcat(szVal,";");   // 分隔符
   lstrcat(szVal,szNewValue); // 附加
   //設置
   if(!SetEnvironmentVariable(szName,szVal))
   {
    printf("Set Value Error %d",GetLastError());
   }
   // 釋放內存
   HeapFree(GetProcessHeap(),0,szVal);
   return TRUE;
}
// 如果是重置,則直接設置
else if(dwFlag == VARIABLES_RESET)
{
   if(!SetEnvironmentVariable(szName,szNewValue))
   {
    printf("Set value error %d",GetLastError());
   }
}
// 清零,忽略szNewValue
else if(dwFlag == VARIABLES_NULL)
{
   if(!SetEnvironmentVariable(szName,NULL))
   {
    printf("Set value error %d",GetLastError());
   }

return TRUE;
}


env.h:
dll的導出函數
#include <windows.h>

#define VARIABLES_APPEND 1
#define VARIABLES_RESET   2
#define VARIABLES_NULL   0

DWORD WINAPI EnumEnvironmentVariables();
DWORD WINAPI ChangeEnviromentVariables(
            LPSTR szName, 
            LPSTR szNewValue,
            DWORD dwFlag);

調用部分:
/* 頭文件 */
#include <windows.h>
#include <stdio.h>


#include "../env_dll/env.h"


/*************************************
* int main(void)
* 功能 演示虛擬內存的使用
*
* 參數 未使用
**************************************/
int main(void)
{
EnumEnvironmentVariables();
ChangeEnviromentVariables("PATH","C:\\",VARIABLES_APPEND);
EnumEnvironmentVariables();
ChangeEnviromentVariables("PATH","C:\\",VARIABLES_NULL);
EnumEnvironmentVariables();
ChangeEnviromentVariables("XX","C:\\",VARIABLES_RESET);
EnumEnvironmentVariables();
}


發佈了49 篇原創文章 · 獲贊 52 · 訪問量 42萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章