C中的环境变量相关编程
1. 如何从程序中获得环境变量?获得一个环境变量可以通过调用‘getenv()’函数完成。
#include <stdlib.h>
char *getenv(const char *name);
2. 如何从程序中设置环境变量?
设置一个环境变量可以通过调用‘putenv()’函数完成。
#include <stdlib.h>
int putenv(char *string);
变量string应该遵守"name=value"的格式。已经传递给putenv函数的字符串*不*能够被释放或变成无效,
因为一个指向它的指针将由‘putenv()’保存。这意味着它必须是在静态数据区中或是从堆(heap)分配的。
如果这个环境变量被另一个‘putenv()’的调用重新定义或删除,上述字符串可以被释放。
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("%s\n",getenv("TEST"));
putenv("TEST=zhong");
printf("%s\n",getenv("TEST"));
return 0;
}
我们经常看到的 int setenv(const char *name, const char *value, int replace)却并没有在VC的标准库中,怎么办呢?
自己动手,丰衣足食:)使用getenv和putenv函数进行扩展即可
具体代码如下:
int setenv(const char *name, const char *value, int replace)
{
char *envstr;
if (name == NULL || value == NULL) return 1;
if (getenv(name) ==NULL) // 未定义
{
envstr = (char *) malloc(strlen(name) + strlen(value) + 2);
sprintf (envstr, "%s=%s", name, value);
if (putenv(envstr)) return 1;
}
else // 定义
{
envstr = (char *) malloc(strlen(name) + strlen(value) + 4 + strlen(getenv(name)));
sprintf (envstr, "%s=%s;", name, value);
strcat(envstr,getenv(name));
if (putenv(envstr)) return 1;
}
return 0;
}
测试代码:
int main()
{
printf("%s\n",getenv("TEST"));
putenv("TEST=zhong");
printf("%s\n",getenv("TEST"));
setenv("MAIL","zhong1",1);
printf("%s\n",getenv("MAIL"));
setenv("MAIL","zhong1",1);
printf("%s\n",getenv("MAIL"));
return 0;
}测试结果见附图
----------------解决方案--------------------------------------------------------
使用 注册表方式设置环境变量
设置环境变量通过程序可以分两步来操作:1、通过修改注册表项来修改环境变量存储的数据
用户环境变量列表的注册表键:
HKEY_CURRENT_USER\Environment
系统环境变量列表的注册表键:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
2、当修改完环境变量的注册表项后,可以通过下面的代码来通知环境变量更新
DWORD dwReturnValue = 0;
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,
(LPARAM) "Environment", SMTO_ABORTIFHUNG,5000, &dwReturnValue);
eg:
reg add HKEY_CURRENT_USER\Environment /v zzz /d qqzzz
----------------解决方案--------------------------------------------------------
第一种是临时的,第二种是全局的。
话说,涉及到环境变量,我宁愿写BAT……
----------------解决方案--------------------------------------------------------
回复 3# StarWing83 的帖子
BAT也是临时的 ----------------解决方案--------------------------------------------------------
BAT是临时的没错,不过如果在bat里面写reg .....
----------------解决方案--------------------------------------------------------