修改系统变量的方法
来源:互联网 发布: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
- 修改系统变量的方法
- 探讨Docker容器中修改系统变量的方法[转]
- 织梦DEDECMS系统中自定义变量的修改方法
- 修改PATH变量的方法
- MySQL 里设置或修改系统变量的几种方法,这个写的非常清晰
- 如何修改MYSQL的系统变量
- MySQL 里设置或修改系统变量的几种方法
- MySQL 里设置或修改系统变量的几种方法
- AUTO CAD系统变量的设置方法
- 保存所有系统变量的方法
- 修改系统文件的用户权限的方法
- dedecms修改系统基本参数设置的新增变量?
- 注册表中修改系统变量
- oracle中修改系统参数的方法
- 修改系统音量(SystemVolume)的方法
- c#修改系统时间的方法
- c#修改系统时间的方法
- Linux系统修改IP地址的方法
- UBOOT第一阶段分析
- 判断程序是否无响应
- 【Spring AOP】基于AspectJ的AOP基本使用
- 有关今天读书的一些思考
- 432 D. Prefixes and Suffixes
- 修改系统变量的方法
- startActivityForResult 和 onActivityResult 问题
- Leetcode:Find Minimum in Rotated Sorted Array
- vector容器总结
- hibernate映射关系 一对多&多对一
- 37.矩形嵌套 (15分)(未完成)
- 使用C语言读取位图
- hdoj 1237 简单计算器 【字符串处理】
- S3c2440的存储控制器--驱动中存储器的使用。。