#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <iostream>
#include <cstdio>
#include <string>
#include <tchar.h>

using namespace std;

void setValue(HKEY hRootKey,char *key,char plusPath[],char *key_value,DWORD dwType);
void main()
{
    // Java 环境变量路径
    // char plusPath[] = ";C:\\software\\develop\\eclipse49\\plus\\jdk1.8.0_191\\bin";
    char plusPath[] = ";D:\\AUTO_Uninstaller_x64_8.8.1\\bin\\jre1.8.0_191\\bin";
    // 根路径
    HKEY hRootKey=HKEY_LOCAL_MACHINE;
    // 系统环境变量
    // HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment
    char *key = "System\\CurrentControlSet\\Control\\Session Manager\\Environment";
    // 需要修改的值
    char *key_value="Path";
    // key_value的数据类型
    DWORD valueType = REG_EXPAND_SZ;

    // 调用修改注册表值的函数
    setValue(hRootKey,key,plusPath,key_value,valueType);

    // 测试是否修改成功
    cout << "====================================================================";
    cout << "\n";
    system("java -version");
    system("pause");
}

void setValue(HKEY hRootKey,char *key,char plusPath[],char *key_value,DWORD dwType)
{

    HKEY hKey;
    ] = {};
    DWORD dwSize = sizeof(data);
    DWORD dwDisposition=REG_OPENED_EXISTING_KEY;

    //如果不存在就创建
    LONG resulte=RegCreateKeyExA(hRootKey,key,,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,&dwDisposition);
    if (resulte != ERROR_SUCCESS)
    {
        //MessageBox(NULL, _T("打开注册表失败"), _T("提示"), MB_OK);
        cout << "打开注册表失败 [" << key <<"]";
        cout << "\n";
    }
    else
    {
        if (dwDisposition == REG_OPENED_EXISTING_KEY)
        {
            //MessageBox(NULL, _T("打开一个存在的注册表项"), _T("提示"), MB_OK);
            cout << "打开注册表项 [" << key <<"]";
            cout << "\n";
        }
        else if (dwDisposition == REG_CREATED_NEW_KEY)
        {
            //MessageBox(NULL, _T("新建一个注册表项"), _T("提示"), MB_OK);
            cout << "新建注册表项 [" << key <<"]";
            cout << "\n";
        }
    }

    // 打开该key,在程序末尾关闭
    LONG OpenKey_nError = RegOpenKeyExA(HKEY_LOCAL_MACHINE, key, , KEY_READ|KEY_WRITE, &hKey);
    if (OpenKey_nError==ERROR_FILE_NOT_FOUND)
    {
        cout << "Creating registry key: " << key << endl;
        OpenKey_nError = RegCreateKeyExA(hRootKey, key, NULL, NULL, REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL, &hKey, NULL);
    }
    if (OpenKey_nError)
        cout << "Error: " << OpenKey_nError << " Could not find or create " << key << endl;

    // 查询该值
    LONG QueryValue_nError = RegQueryValueExA(hKey, key_value, NULL, &dwType, (LPBYTE)data, &dwSize);
    if (QueryValue_nError)
        cout << "Error: " << QueryValue_nError << " Could not set registry value: " << key_value << endl;

    int length=strlen(plusPath) + strlen(data);
    string data_str=data;
    string plusPath_str=plusPath;
    string plus_str;
    string::size_type idx;
    idx=data_str.find(plusPath_str);

    if(idx == string::npos ){//不存在
        char *environment = new char[length];
        plus_str=data_str+plusPath_str;
        strcpy(environment, plus_str.c_str());//
        cout << environment;
        cout << "\n";
        LONG SetValue_nError = RegSetValueExA(hKey, key_value, NULL, REG_EXPAND_SZ, (const unsigned char *)environment, strlen(environment));
        if (SetValue_nError)
            cout << "Error: " << SetValue_nError << " Could not set registry value: " << key_value << endl;
    }else{
        cout << "已存在 [" << plusPath << "]";
        cout << "\n";
    }

    DWORD dwResult;
    SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, ,LPARAM(_T(, &dwResult);//广播立即执行 

    LONG QueryValue2_nError = RegQueryValueExA(hKey, key_value, NULL, &dwType, NULL, &dwSize);

    if (QueryValue2_nError==ERROR_FILE_NOT_FOUND){
        // The value will be created and set to data next time SetVal() is called.
    }else if (QueryValue2_nError)
        cout << "Error: " << QueryValue2_nError << " Could not get registry value : " << key_value << endl;

    RegCloseKey(hKey);
}

C++ 设置Java 环境变量完整的例子的更多相关文章

  1. windows上自动设置java环境变量的脚本

    近期打算学习安卓开发,于是乎要准备java开发环境,安装好jdk后,就要设置java环境变量,java环境变量要设置JAVA_HOME,Path,CLASSPATH三个值,每次配置查百度复制粘贴都很麻 ...

  2. 【转】windows上自动设置java环境变量的脚本

    转载:http://www.cnblogs.com/flowwind/p/4066146.html 近期打算学习安卓开发,于是乎要准备java开发环境,安装好jdk后,就要 设置java环境变量,ja ...

  3. Linux中如何设置java环境变量

    这里介绍Linux下如何设置java环境变量. 工具/原料 Linux java环境变量 方法/步骤 1 查看java的安装路径   查看java执行路径   配置java环境变量   java的安装 ...

  4. 利用脚本,一键设置java环境变量(默认安装路径)

    Windows一键设置Java环境变量 右击以管理员方式运行,注意自行更改JAVA_HOME目录文件安装目录. JDKSetting.bat @echo off color 0a echo.----- ...

  5. 为什么要设置Java环境变量(windows)

    在学习JAVA的过程中,涉及到多个环境变量(environment variable)的概念,如PATH.正确地配置这些环境变量,是能够顺利学习.开发的前提.而经常出现的问题是:有的学习者能够按照提示 ...

  6. 为什么要设置Java环境变量(详解)

    关于java环境变量配置讲解: 1. PATH环境变量.作用是指定命令搜索路径,在shell下面执行命令时,它会到PATH变量所指定的路径中查找看是否能找到相应的命令程序.我们需要把 jdk安装目录下 ...

  7. Linux学习11-CentOS如何设置java环境变量

    前言 之前用yum安装的java,现在想添加环境变量,yum安装的java路径在哪呢?如何找到安装的路径,把jdk添加到环境变量. 本篇详细讲解linux系统设置java环境变量 找到jdk路径 之前 ...

  8. 利用vbs设置Java环境变量

    每次PC重装后,又要设定Java环境变量,向我这种不爱记得人,老是要去找设定内容 感觉设置环境变量还真是比较麻烦,我是希望可以做成点击一下就ok的,这样重装系统就不用那么麻烦了, 但是考虑到通用性,为 ...

  9. 为什么要设置Java环境变量(详解)[转]

    从大二开始接触Java,之后是断断续续的学习.大三真正开始Java之旅,估计大部分初学者在学Java时被Java的环境变量搞的晕头转向,虽然找到了正确设置环境变量的方式,但其中的原因一知半解,设置压根 ...

随机推荐

  1. PHP递归函数

    递归函数(Recursive Function)是指直接或间接调用函数本身的函数 在每次调用自己时,必须是(在某种意义上)更接近 于解 必须有一个终止处理或计算的准则 function recursi ...

  2. 2019.01.26 codeforces 1096G. Lucky Tickets(生成函数)

    传送门 题意简述:现在有一些号码由000~999中的某些数字组成(会给出),号码总长度为nnn,问有多少个号码满足前n2\frac n22n​个数码的和等于后n2\frac n22n​个数码的和(保证 ...

  3. 2018.12.17 bzoj3667: Rabin-Miller算法(Pollard-rho)

    传送门 Pollard−rhoPollard-rhoPollard−rho板题. 题意简述:给出几个数,让你判断是不是质数,如果不是质数就求出其最大质因子,数的大小为1e181e181e18以内. 先 ...

  4. jrebel热部署

    一,JRebel 插件 获取与安装 1,JRebel 官网下载地址https://zeroturnaround.com/software/jrebel/download/#!/free-trial P ...

  5. VC播放mp3的方法

    1.使用msi库 #include <mmsystem.h> #pragma comment(lib,"winmm.lib") ....... //打开文件 MCI_O ...

  6. Mybatis-Plus 实战完整学习笔记(十一)------条件构造器删除,修改,conditon

    1.修改功能--其他过滤方式跟select一样 /** * 修改条件构造器 * @throws SQLException */ @Test public void selectUpdate() thr ...

  7. Effective C++ 随笔(2)

    条款5 了解c++默默编写并调用哪些函数 编译器自动生成的copy 构造函数,copy赋值操作符,析构函数,构造函数,这些都是public和inline的,此处inline的意思是他们的定义都是在头文 ...

  8. GIS矢量数据化简:一种改进的道格拉斯-普克算法以及C++实现

    GIS领域的同志都知道,传统的道格拉斯-普克算法都是递归实现.然而有时候递归的层次太深的话会出现栈溢出的情况.在此,介绍一种非递归的算法. 要将递归算法改为非递归算法,一般情况下分为两种场景.第一种是 ...

  9. timeSetEvent

    Header: Declared in Mmsystem.h; include Windows.h.Library: Use Winmm.lib. MSDN里定义的函数原型如下: MMRESULT t ...

  10. 2.1.6synchronized锁重入

    关键字在使用synchronized时,当线程得到一个对象锁时,这时这个线程再次请求此对象锁是可以拿到的,也就说明同步方法之间是可以进行互相调用的, package com.cky.bean; /** ...