您的位置:首页 > 其它

设置和获取所在进程的环境变量

2013-05-28 08:02 120 查看
转载网址: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();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: