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#程序.手动修改.安装项目等不同方式对注册表进行修改.其中通过安装项目对 ...
随机推荐
- UVA_489:Hangman Judge
Language:C++ 4.8.2 #include<stdio.h> #include<string.h> int main(void) { ]; ]; ]; ]; // ...
- MaxCompute 项目子账号做权限管理
场景: 一个企业使用多款阿里云产品,MaxCompute是其中一个产品,用的是同个主账号,主账号不是由使用MaxCompute的大数据同学管理, 大数据同学使用的是子账号.大数据同学日常需要给Max ...
- Calendar类实现当前日期的日历
package com.sxt.home1; import java.text.DateFormat; import java.text.ParseException; import java.tex ...
- 轻松学习之 IMP指针的作用
http://www.cocoachina.com/ios/20150717/12623.html 可能大家一直看到有许多朋友在Runtime相关文章中介绍IMP指针的概念,那么IMP究竟有什么实际作 ...
- oracle函数 MAX([distinct|all]x)
[功能]统计数据表选中行x列的最大值. [参数]all表示对所有的值求最大值,distinct只对不同的值求最大值,默认为all 如果有参数distinct或all,需有空格与x(列)隔开. [参数] ...
- Libev源码分析08:Libev中的信号监视器
Libev中的信号监视器,用于监控信号的发生,因信号是异步的,所以Libev的处理方式是尽量的将异步信号同步化.异步信号的同步化方法主要有:signalfd.eventfd.pipe.sigwaiti ...
- @loj - 6353@「CodePlus 2018 4 月赛」组合数问题 2
目录 @description@ @solution@ @accepted code@ @details@ @description@ 请你找到 k 个不同的组合数,使得对于其中任何一个组合数 \(C ...
- 模板—堆优化dijkstra
];]; void dijkstra(int s) { memset(dis,0x7f,sizeof(dis));ma(v); priority_queue<pair<int,int> ...
- MySQL_连表查询
连表查询 连表查询通常分为内连接和外连接.内连接就是使用INNER JOIN进行连表查询:而外连接又分为三种连接方式,分别是左连接(LEFT JOIN).右连接(RIGHT JOIN).全连接(FUL ...
- 高级PHP开发:利用PHPEMS搭建在线考试平台
今天给大家分享一个小技巧,就是利用PHP ems搭建在线考试平台:希望能给你给予帮助: 在给大家分享之前,这里推荐下我自己建的PHP开发-VIP资料出售平台 :638965404,不管你是小白还是大牛 ...