修改系统变量的方法

来源:互联网 发布:iphone 图片导出 mac 编辑:程序博客网 时间:2024/06/06 06:58

我想做一个程序,可以一键设置系统变量的

刚开始想用才C# ,但一想有点小题大做,而且修改系统变量一般都比较底层一些,所以改用c了

刚开始使用:

getenv、putenv,setenv,unsetenv来实现的,可是发现C的控制台一结束,系统变量并没有发生变化,只是在程序运行时存在!有很大的弊端。实用性不大

定义函数  char * getenv(const char*name);

函数说明  getenv()用来取得参数name环境变量的内容。参数name为环境变量的名称,如果该变量存在则会返回指向该内容的指针。环境变量的格式为name=value。

 

返回值  执行成功则返回指向该内容的指针,找不到符合的环境变量名称则返回NULL。


范例  

#include<stdlib.h>mian(){char *p;if((p = getenv(“USER”)))printf(“USER=%s\n”,p);}

定义函数  int putenv(const char *string);

 

函数说明  putenv()用来改变或增加环境变量的内容。参数string的格式为name=value,如果该环境变量原先存在,则变量内容会依参数string改变,否则此参数内容会成为新的环境变量。

 

返回值  执行成功则返回0,有错误发生则返回-1。

 

错误代码  ENOMEM 内存不足,无法配置新的环境变量空间。



 #include<stdlib.h>main(){char *p;if((p = getenv(“USER”)))printf(“USER =%s\n”,p);putenv(“USER=test”);printf(“USER+5s\n”,getenv(“USER”));}

 

定义函数  int setenv(const char *name,const char *value,int overwrite);

 

函数说明  setenv()用来改变或增加环境变量的内容。参数name为环境变量名称字符串。

 

参数  value则为变量内容,参数overwrite用来决定是否要改变已存在的环境变量。如果overwrite不为0,而该环境变量原已有内容,则原内容会被改为参数value所指的变量内容。如果overwrite为0,且该环境变量已有内容,则参数value会被忽略。

 

返回值  执行成功则返回0,有错误发生时返回-1。

 

错误代码  ENOMEM 内存不足,无法配置新的环境变量空间

 #include<stdlib.h>main(){char * p;if((p=getenv(“USER”)))printf(“USER =%s\n”,p);setenv(“USER”,”test”,1);printf(“USER=%s\n”,getenv(“USEr”));unsetenv(“USER”);printf(“USER=%s\n”,getenv(“USER”));}


后来使用 : cmd 进行 set   valuename=value 的方法来改变系统变量。,发现还是和上面的情况一样,没有发生实质上的变化

然后想通过修改注册表对应键值来修改系统环境变量

主要用到的函数有:

:RegOpenKeyEx, RegQueryValueEx, RegSetValueEx


我在网上找了两种方法来实现的,发现不知道为什么在我的电脑上成功不了

#include<stdlib.h>#include <stdio.h>#include <iostream.h>#include "Windows.h"void CreateStringReg(HKEY hRoot,LPCTSTR  szSubKey,char * ValueName,char * Buffer){HKEY hKey;if(RegCreateKeyEx(hRoot,szSubKey,0,NULL,REG_OPTION_NON_VOLATILE,KEY_SET_VALUE,NULL,&hKey,NULL)!= ERROR_SUCCESS)printf("RegCreateKeyEx error\n");if(RegSetValueEx(hKey,ValueName,0,REG_EXPAND_SZ,(CONST BYTE*)Buffer,strlen(Buffer) + 1)!= ERROR_SUCCESS)printf("RegSetValueEx error\n");RegCloseKey(hKey);}DWORD    _RegQueryValue(HKEY hRootKey, LPCTSTR lpszKey,  char *  lpszValueName, char *  lpszValue,                        LPDWORD lpdwSize, LPDWORD lpdwType){    HKEY hKey;    DWORD dwRtn = -1;    // 打开子键    dwRtn = RegOpenKeyEx(hRootKey, lpszKey, NULL, KEY_QUERY_VALUE, &hKey);    if ( dwRtn == ERROR_SUCCESS )    {        // 查询当前子键下的某一键值, lpszValueName为键的名称, lpszValue为返回的键值        dwRtn = RegQueryValueEx(hKey,  lpszValueName, NULL, lpdwType, (unsigned char *)lpszValue, lpdwSize);        RegCloseKey(hKey);    }    return dwRtn;}void    _RegSetValue(HKEY hRootKey, LPCTSTR lpszKey, LPCTSTR lpszValueName, char * lpszValue,                      DWORD dwValueType, DWORD dwSize){    HKEY hKey;    // 获取将要创建键值的子键的句柄    if  ( ERROR_SUCCESS == RegCreateKey(hRootKey, lpszKey, &hKey) )    {        // 设置键值       if( RegSetValueEx(hKey, lpszValueName, 0, dwValueType, (CONST BYTE*)lpszValue, dwSize)!=ERROR_SUCCESS);<span style="white-space:pre"></span>   cout<<endl<<"ddddddd"<<endl;        RegCloseKey(hKey);    }}int main(int argc, char* argv[]){int i;char * p;CreateStringReg(HKEY_LOCAL_MACHINE,LPCTSTR("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment"),"path","D:\\ddd");//_RegSetValue(HKEY_LOCAL_MACHINE,LPCTSTR("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment"),LPCTSTR("path"),"D:\\ddd",REG_EXPAND_SZ,strlen("D:\\ddd") + 1);if((p = getenv("path")))printf("path=%s\n",p);cin>>i;return 0;}

最后通过cmd 命令  ,通过执行bat文件来实现的。实现的是对jdk环境变量的设置

将bat文件放置安装目录处,运行即可。

@ECHO OFFIF EXIST %CD%\bin\java.exe (IF EXIST %systemroot%\system32\setx.exe (@ECHO "设置JAVA_HOME:%CD%"@SETX JAVA_HOME %CD%@ECHO "设置CLASSPATH:.;%%JAVA_HOME%%\lib\tools.jar;%%JAVA_HOME%%\lib\dt.jar;%%JAVA_HOME%%\jre\lib\rt.jar"@SETX CLASSPATH ".;%%JAVA_HOME%%\lib\tools.jar;%%JAVA_HOME%%\lib\dt.jar;%%JAVA_HOME%%\jre\lib\rt.jar"@ECHO "设置PATH:%%JAVA_HOME%%\bin"@SETX PATH "%%JAVA_HOME%%\bin"@ECHO JDK环境变量设置成功) ELSE (@ECHO ON@ECHO 未能找到%systemroot%\system32\setx.exe,请下载setx.exe程序)) ELSE (@ECHO ON@ECHO JDK安装目录不正确,未能按照预期计划执行)@PAUSE


0 0
原创粉丝点击