环境变量生效

最近开始学Java。我们主要学Java Application和Java Applet两个分类。为了在任意目录下都能编译和运行Java程序,需要对path和classpath环境变量进行相关设置。终于知道环境变量用处之一了。想用程序来实现一下设置环境变量。好不容易用注册表函数写好,结果不行。晕。。。后来想到应该要刷新一下。注销和重起都可以。但我想实现的是立即生效。后来上网搜了一下,得到如下结果:
通过修改注册表,修改了系统的环境变量,但是不会立即生效,除非在【我的电脑】上点击右键,然后打开环境变量的窗口,点击【OK】后,才能生效。后来用Spy++工具捕获消息,发现在点击【OK】按钮时,发送了WM_SETTINGCHANGE消息。
这里有两种方法可以实现:
1.SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,(LPARAM)TEXT("Environment"));
2.SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Environment", SMTO_ABORTIFHUNG, 5000, 0);
终于成功了,高兴哇。后来无意中发现用VBS配置环境变量并立即生效简单得要命,当场晕倒。。。
下面把两种实现方法都贴出来吧。
//配置JAVA环境变量

#include <windows.h>

#include <string.h>

#include <stdlib.h>

 

int SetValue (char * valueName, char *AddValue);

 

DWORD nLength = MAX_PATH;

char DirectoryName[MAX_PATH];

 

int APIENTRY WinMain(HINSTANCE hInstance,

                     HINSTANCE hPrevInstance,

                     LPSTR     lpCmdLine,

                     int       nCmdShow)

{

        char pValue[MAX_PATH];

        ::ZeroMemory(DirectoryName,MAX_PATH);

        ::ZeroMemory(pValue,MAX_PATH);

 

        // 得到当前执行文件的路径名       

        ::GetCurrentDirectory(nLength,DirectoryName);

 

        // 设置path环境变量

        strcat(pValue,";");

        strcat(pValue,DirectoryName);

        strcat(pValue,"//bin");

        SetValue("path",pValue);

 

        // 重置pValue

        ::ZeroMemory(pValue,MAX_PATH);

 

        // 设置classpath环境变量

        strcat(pValue,".;");

        strcat(pValue,DirectoryName);

        strcat(pValue,"//lib//tool.jar;");

        strcat(pValue,DirectoryName);

        strcat(pValue,"//lib//dt.jar");

        SetValue("classpath",pValue);

        return 0;

}

 

int SetValue(char * valueName, char *AddValue)

{

        DWORD keyType = REG_SZ;       

        BYTE getValue[1024];

        DWORD DataLen = 1024;

        HKEY hRoot = HKEY_LOCAL_MACHINE;

        HKEY hKey;

        char *pIsset;

        ::ZeroMemory(getValue,MAX_PATH);

    char *szSubKey = "SYSTEM//CurrentControlSet//Control//Session Manager//Environment";

       

        // 打开键

        DWORD dwDisposition = REG_OPENED_EXISTING_KEY;       

        LONG lRet = ::RegCreateKeyEx(hRoot, szSubKey, 0, NULL, REG_OPTION_NON_VOLATILE,

 

KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition);

        if (lRet != ERROR_SUCCESS)

                return -1;

       

        // 读取键值

        lRet = ::RegQueryValueEx(hKey,valueName,NULL,&keyType,getValue,&DataLen);

       

        pIsset = strstr((char*)getValue, DirectoryName);

 

        // 如果已设置则返回

        if (pIsset)

        {

                char MsgText[80];

                strcpy(MsgText,valueName);

                strcat(MsgText,"环境变量已配置好,不需再配置!");

                ::MessageBox(NULL,MsgText,"fc提示",MB_OK);

                return -1;

        }

 

        strcat((char*)getValue,AddValue);

       

        // 写入键值

        lRet = ::RegSetValueEx(hKey, valueName, 0, REG_SZ, (BYTE*)getValue, strlen((char*)

 

getValue));

        if (lRet == ERROR_SUCCESS)

        {       

                char MsgText[80];

                strcpy(MsgText,valueName);

                strcat(MsgText,"环境变量配置成功!");

                ::MessageBox(NULL,MsgText,"fc提示",MB_OK);

 

                // 使设置立即生效,下面两种法都可以

                SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,(LPARAM)TEXT("Environment"));

                //SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,

 

(LPARAM)"Environment", SMTO_ABORTIFHUNG, 5000, 0);

        }

       

        // 关闭句柄

        ::RegCloseKey(hKey);

        return 0;

}
复制代码
on error resume next

set sysenv = CreateObject("WScript.Shell").Environment("system") '系统环境变量的数组对象

sysenv.Remove("ztest3")                      '删除变量

sysenv("ztest3")="test value"                '添加变量
复制代码
VBS这种简单吧……

 

 

HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Run

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值