当前位置: 代码迷 >> C语言 >> C中的环境变量相关编程
  详细解决方案

C中的环境变量相关编程

热度:439   发布时间:2008-05-29 13:19:14.0
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;
}测试结果见附图
搜索更多相关的解决方案: 环境变量  putenv  char  name  函数  

----------------解决方案--------------------------------------------------------
使用 注册表方式设置环境变量
设置环境变量通过程序可以分两步来操作:

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 .....
----------------解决方案--------------------------------------------------------
  相关解决方案