c++修改系统环境变量 (修改注册表以后,立刻使用SendMessageTimeout(HWND_BROADCAST进行广播)
#include "stdafx.h"
#include "addPath.h" #define _AFXDLL
#include <afxwin.h>
#include <iostream>
#include <tchar.h>
#include <afx.h>
#include <afxpriv.h>
using namespace std ; int AddPath(char * strPath)
{
HKEY hkResult;//键的句柄
LPCTSTR environmentKey =_T("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment");
//HKEY_CURRENT_USER HKEY_LOCAL_MACHINE
//LPCTSTR environmentKey =_T("Environment");
if(ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, environmentKey , ,KEY_SET_VALUE | KEY_READ , &hkResult)) //打开键environment
{
MessageBox(NULL,_T("访问注册表出错!\n请使用管理员帐户执行本程序!"),_T("ERROR"),MB_ICONERROR);
return ;
}
DWORD BufferSize = ; //数据长度
DWORD cbData; ////数据长度
DWORD dwRet;
VOID* PerfData = malloc( BufferSize );//数据存放地址
cbData = BufferSize; LPCTSTR myVariable=_T("PATH");//环境变量
dwRet = RegQueryValueEx( hkResult,myVariable, NULL, NULL, (LPBYTE) PerfData, &cbData ); //读取某子键下特定名称的值
while (dwRet == ERROR_MORE_DATA)
{
BufferSize += ;
PerfData = realloc( PerfData, BufferSize );
cbData = BufferSize;
dwRet = RegQueryValueEx( hkResult,myVariable,NULL,NULL,(LPBYTE) PerfData, &cbData );
}
//MessageBox(NULL,(LPCTSTR)PerfData,_T("我的系统变量Path"),MB_OK); if (dwRet == ERROR_SUCCESS)//名称不存在时,添加这个名称并设定其值
{
//判断是否存在myValue
if(IsPathExist(PerfData,strPath))
{
//MessageBox(NULL,_T("环境变量已经存在!"),_T("信息"),MB_OK);
RegCloseKey(hkResult);//释放键句柄
free(PerfData);
return ;
} LPTSTR myValueEx = new TCHAR[strlen(strPath)+];//此处,不是用sizeof() 函数,注意区别
strcpy((char*)myValueEx,strPath);
TCHAR lastChar=((LPTSTR)PerfData)[cbData-];//字符串以\0结尾
if(lastChar!=';')
{
strcpy((char*)myValueEx,";");
strcat((char*)myValueEx,strPath);
//printf("%s %s\n",strPath,myValueEx);
//printf("%d %d\n",strlen(strPath),strlen((char*)myValueEx));
} CString strMyValueEx;
USES_CONVERSION;
strMyValueEx = A2T((LPCSTR)myValueEx);
//MessageBox(NULL,strMyValueEx,_T("信息"),MB_OK); TCHAR * temp = new TCHAR[cbData+strlen((char*)myValueEx)];
_tcscpy_s(temp, cbData, (LPTSTR)PerfData);//拷贝path中原有的字符串到temp中
//printf("temp:%s\n\n",temp); LPTSTR pathValue = _tcscat(temp, strMyValueEx); //类似memcpy
//printf("pathValue:%s\n\n",pathValue); long setResult = RegSetValueEx(hkResult,myVariable,, /*REG_SZ*/REG_EXPAND_SZ, (LPBYTE) pathValue,_tcsclen(pathValue)*sizeof(TCHAR));//设置某子键下特定名称的值。
DWORD dwResult;
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE , ,LPARAM(_T("Environment")), SMTO_ABORTIFHUNG, , &dwResult);//广播立即执行
/*if(ERROR_SUCCESS == setResult)
{
MessageBox(NULL,_T("环境变量设置完成!"),_T("信息"),MB_OK);
}
else
{
MessageBox(NULL,_T("环境变量设置失败!"),_T("信息"),MB_OK);
}*/
delete []myValueEx;
delete []temp;
temp = NULL ;
}
else
{
MessageBox(NULL,_T("环境变量读取失败!"),_T("信息"),MB_OK);
}
//printf("\nEnd Register\n");
RegCloseKey(hkResult);//释放键句柄
free(PerfData);
PerfData = NULL ;
//printf("\nEnd AddPath\n");
return ;
} int IsPathExist(void *PerfData,char *myPath)
{
//return 0 ;
char * myoldPath = (char*)PerfData;
int i = ;
while(myoldPath[i] != '\0')
{
i = i + ;
}
char * path_t = new char[i/+]; i = ;
while(myoldPath[i] != '\0')
{
path_t[i/] = myoldPath[i];
i = i + ;
}
path_t[i/] = '\0';
path_t[i/+] = '\0'; CString strMyoldPath;
CString strMyPath;
USES_CONVERSION;
strMyoldPath = A2T((LPCSTR)path_t);
strMyPath = A2T((LPCSTR)myPath); if(strMyoldPath[strMyoldPath.GetLength()-] != ';')
{
strMyoldPath = strMyoldPath + _T(";") ;
}
if(strMyPath[strMyPath.GetLength()-] != ';')
{
strMyPath = strMyPath + _T(";") ;
} if(- == strMyoldPath.Find(strMyPath,))
{
delete path_t;
return ;
} delete path_t;
return ;
}
http://download.csdn.net/download/autumoonchina/8747921
c++修改系统环境变量 (修改注册表以后,立刻使用SendMessageTimeout(HWND_BROADCAST进行广播)的更多相关文章
- Windows 10 修改系统环境变量后,CMD生效,Powershell未生效
Windows 10 修改系统环境变量后 1.CMD重新打开,新环境变量已经生效: 2.Shift+右键Powershell重新打开,新环境变量没有生效: 3.貌似服务(Apache24)中使用的环境 ...
- 修改系统环境变量 cmd命令
详细大家对cmd的使用都有了一些简单的了解,但是困扰大家的主要的问题就是: cmd命令修改环境变量有两种方式:1. 短期内有效,在关闭dos窗口后就自动失效 2.长期有效,关闭dos窗口后还有效 下面 ...
- 【代码备忘录】VC设置您的计算机环境变量、注册表操作
欢迎增加C/C++ QQ组,无论你的工作.学生,只有具备c / vc / c++ 编程经验.就来吧!158427611 [设置电脑环境变量] 设置电脑环境变量非常easy,由于window而言.环境变 ...
- ubuntu修改系统环境变量文件导致起不来
修改/etc/environment文件导致系统起不来. 长按shift,进入恢复界面,然后以root方式登录命令行界面 然后vi修改/etc/environment文件 提示:Unable to o ...
- C#修改系统环境变量,调用批处理bat
一.设置环境变量 public void SetPath(string pathValue) { string pathlist; pathlist = Environment.GetEnvironm ...
- 修改ie版本的注册表webbroswer
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Exp ...
- Ubuntu 12 修改环境变量
Ubuntu Linux系统包含两类环境变量:系统环境变量和用户环境变量.系统环境变量对所有系统用户都有效,用户环境变量仅仅对当前的用户有效. 修改用户环境变量 用户环境变量通常被存储在下面的文件中: ...
- 通过程序修改注册表键值来达到修改IE配置参数的目的
通过程序修改注册表键值来达到修改IE配置参数的目的 使用IE访问应用程序或网页时经常需要设置一些选项(工具-Internet 选项),比如为了避免缓存网页,把工具-Internet选项-常规选项卡-I ...
- C#综合揭秘——通过修改注册表建立Windows自定义协议
引言 本文主要介绍注册表的概念与其相关根项的功能,以及浏览器如何通过连接调用自定义协议并与客户端进行数据通信.文中讲及如何通过C#程序.手动修改.安装项目等不同方式对注册表进行修改.其中通过安装项目对 ...
随机推荐
- apache服务器配置防盗链(centos7)
<Directory /data/wwwroot/xwl.com> SetEnvIfNoCase Referer "^$" local_ref SetEnvIfNoCa ...
- 2018-10-19-Roslyn-使用-Directory.Build.props-文件定义编译
title author date CreateTime categories Roslyn 使用 Directory.Build.props 文件定义编译 lindexi 2018-10-19 18 ...
- Azkaban3.x
Azkaban3.x安装部署 官方文档地址 三种模式 solo-server模式:exec进程和web进程为同一个进程,存放元数据的数据库为H2 two-server模式:与之前的单机版本类似,exe ...
- C#中的字段,常量,属性与方法
以前是学C++的,初次学微软的C#头都大了.什么字段,常量,属性,方法......微软把别人的东西拿来糅合在C#里,弄成了一个“大杂烩”.其实,说到底,“字段”不就是“变量”吗,所谓的“方法”不就是“ ...
- HLSL像素着色器
原文:HLSL像素着色器 昨日不可追, 今日尤可为.勤奋,炽诚,不忘初心 手机淘宝二维码 扫描 或者打开连接:程序设计开发 ,掌声鼓励,欢迎光临. 像素着色器替代了固定渲染管线的 ...
- oracle函数 TO_CHAR(x[[,c2],C3])
[功能]将日期或数据转换为char数据类型 [参数] x是一个date或number数据类型. c2为格式参数 c3为NLS设置参数 如果x为日期nlsparm=NLS_DATE_LANGUAGE 控 ...
- jq 监听返回事件
<script> $(document).ready(function(e) { var counter = 0; if (window.hi ...
- jmeter日期处理beanshell(1)
import java.time.LocalDate; //昨天: String sdate1 = LocalDate.now().minusDays(1).toString(); vars.put( ...
- docfx 做一个和微软一样的文档平台
开发中,有一句话叫 最不喜欢的是写文档,最不喜欢的是看别人家代码没有文档.那么世界上文档写最 la 好 ji 的就是微软了,那么微软的api文档是如何做的?难道请了很多人去写文档? 实际上微软有工具用 ...
- php统计近一周和近30天的用户数据
https://blog.csdn.net/shenpengchao/article/details/59073589 先上一张效果图 这边用的是echarts插件http://echarts.bai ...