#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进行广播)的更多相关文章

  1. Windows 10 修改系统环境变量后,CMD生效,Powershell未生效

    Windows 10 修改系统环境变量后 1.CMD重新打开,新环境变量已经生效: 2.Shift+右键Powershell重新打开,新环境变量没有生效: 3.貌似服务(Apache24)中使用的环境 ...

  2. 修改系统环境变量 cmd命令

    详细大家对cmd的使用都有了一些简单的了解,但是困扰大家的主要的问题就是: cmd命令修改环境变量有两种方式:1. 短期内有效,在关闭dos窗口后就自动失效 2.长期有效,关闭dos窗口后还有效 下面 ...

  3. 【代码备忘录】VC设置您的计算机环境变量、注册表操作

    欢迎增加C/C++ QQ组,无论你的工作.学生,只有具备c / vc / c++ 编程经验.就来吧!158427611 [设置电脑环境变量] 设置电脑环境变量非常easy,由于window而言.环境变 ...

  4. ubuntu修改系统环境变量文件导致起不来

    修改/etc/environment文件导致系统起不来. 长按shift,进入恢复界面,然后以root方式登录命令行界面 然后vi修改/etc/environment文件 提示:Unable to o ...

  5. C#修改系统环境变量,调用批处理bat

    一.设置环境变量 public void SetPath(string pathValue) { string pathlist; pathlist = Environment.GetEnvironm ...

  6. 修改ie版本的注册表webbroswer

    Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Exp ...

  7. Ubuntu 12 修改环境变量

    Ubuntu Linux系统包含两类环境变量:系统环境变量和用户环境变量.系统环境变量对所有系统用户都有效,用户环境变量仅仅对当前的用户有效. 修改用户环境变量 用户环境变量通常被存储在下面的文件中: ...

  8. 通过程序修改注册表键值来达到修改IE配置参数的目的

    通过程序修改注册表键值来达到修改IE配置参数的目的 使用IE访问应用程序或网页时经常需要设置一些选项(工具-Internet 选项),比如为了避免缓存网页,把工具-Internet选项-常规选项卡-I ...

  9. C#综合揭秘——通过修改注册表建立Windows自定义协议

    引言 本文主要介绍注册表的概念与其相关根项的功能,以及浏览器如何通过连接调用自定义协议并与客户端进行数据通信.文中讲及如何通过C#程序.手动修改.安装项目等不同方式对注册表进行修改.其中通过安装项目对 ...

随机推荐

  1. 2019-6-23-WPF-网络-request-的-read-方法不会返回

    title author date CreateTime categories WPF 网络 request 的 read 方法不会返回 lindexi 2019-06-23 11:26:26 +08 ...

  2. Spark in action on Kubernetes - 存储篇(一)

    前言 在上篇文章中,我们分析了Spark Operator内部的机制,今天我们会讨论一个在大数据领域中最重要的话题 - 存储.大数据已经无声无息的融入了每个人的生活中.大到旅游买房,小到外卖打车,都可 ...

  3. 2017 ACM/ICPC Asia Regional Shenyang Online:number number number hdu 6198【矩阵快速幂】

    Problem Description We define a sequence F: ⋅ F0=0,F1=1;⋅ Fn=Fn−1+Fn−2 (n≥2). Give you an integer k, ...

  4. Django框架form表单的那些事儿

    Form那些事儿 创建Form类时,主要涉及到 [字段] 和 [插件],字段用于对用户请求数据的验证,插件用于自动生成HTML; 1:initial 初始值,input框里面的初始值. class L ...

  5. oracle函数 TO_MULTI_BYTE(c1)

    [功能]将字符串中的半角转化为全角 [参数]c1,字符型 [返回]字符串 [示例] SQL> select to_multi_byte('高A') text from dual; test -- ...

  6. Vue.js 第1章 Vue常用指令学习

    今日目标 能够写出第一个vue应用程序 能够接受为什么需要学vue 能够使用指令 能够通过指定完成简单的业务(增加删除查询) 能够理解mvvm 为什么要学习vue 企业需要 可以提高开发效率 实现vu ...

  7. uva 11754 Code Feat (中国剩余定理)

    UVA 11754 一道中国剩余定理加上搜索的题目.分两种情况来考虑,当组合总数比较大的时候,就选择枚举的方式,组合总数的时候比较小时就选择搜索然后用中国剩余定理求出得数. 代码如下: #includ ...

  8. Pytorch实现MNIST(附SGD、Adam、AdaBound不同优化器下的训练比较) adabound实现

     学习工具最快的方法就是在使用的过程中学习,也就是在工作中(解决实际问题中)学习.文章结尾处附完整代码. 一.数据准备  在Pytorch中提供了MNIST的数据,因此我们只需要使用Pytorch提供 ...

  9. poj 1066 Treasure Hunt (Geometry + BFS)

    1066 -- Treasure Hunt 题意是,在一个金字塔中有一个宝藏,金字塔里面有很多的墙,要穿过墙壁才能进入到宝藏所在的地方.可是因为某些原因,只能在两个墙壁的交点连线的中点穿过墙壁.问最少 ...

  10. 【TensorFlow】理解tf.nn.conv2d方法 ( 附代码详解注释 )

    最近在研究学习TensorFlow,在做识别手写数字的demo时,遇到了tf.nn.conv2d这个方法,查阅了官网的API 发现讲得比较简略,还是没理解.google了一下,参考了网上一些朋友写得博 ...