程序截图如下:

MFC打造Java环境变量设置工具..._mfc

MFC打造Java环境变量设置工具..._java_02

写本程序的目的:

很多安装Java的JDK的童鞋们,最头疼的莫过于设置Java的环境变量了,

偶一次又一次地帮他们设置,渐渐地就觉得无聊了,于是乎决定写这么个小

工具给他们用,以后偶就不用为此担忧了~_~!...

本程序的难点:

难点就是如何修改系统的环境变量了,网上查了很久,没发现有什么专门的API

可以直接操作系统的环境变量,许多人都为此苦苦的寻问着,就是找不到API啊!...

本程序的思路:

    某天在查找与环境变量有关的API时,看到一童鞋说系统的环境变量的值就存放在

以下注册表键里:

HKEY_LOCAL_MACHIN\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

XP系统下截图如下:

MFC打造Java环境变量设置工具..._mfc_03

 

呵呵,既然系统环境变量的值存放在注册表里面,那就好办多了,我们只须修改注册表就可以

修改系统的环境变量了,何必苦苦地去寻找API呢?根据这思路,我用VS2005+MFC完成了本工具的编写~_~!...

注:操作注册表时,我用了ATL库中的类CRegKey, 想了解的话,百度一下即可。

本程序主要代码如下:

//浏览按钮
void CJavaEnvSetToolDlg::OnBnClickedBtnBrowse()
{

TCHAR SelJavaPath[MAX_PATH]={0}; //保存用户选择的Java路径
BROWSEINFO broInfo={0}; //浏览变量

//memset(SelJavaPath, 0, MAX_PATH); // 初始化SelJavaPath
//memset(&bi, 0, sizeof(BROWSEINFO)); // 初始化bi
broInfo.hwndOwner = this->m_hWnd; //父窗口句柄
broInfo.pidlRoot = NULL; //要显示的文件夹的根(Root)
broInfo.pszDisplayName =SelJavaPath; // 保存被选取的文件夹路径的缓冲区
broInfo.lpszTitle = _T("请选择Java的安装目录..."); //对话框左上部的标题

// 指定对话框的外观和功能的标志
broInfo.ulFlags = BIF_NEWDIALOGSTYLE |
BIF_DONTGOBELOWDOMAIN|
BIF_BROWSEFORCOMPUTER|
BIF_RETURNONLYFSDIRS |
BIF_RETURNFSANCESTORS;

broInfo.lpfn = NULL; //处理事件的回调函数
broInfo.lParam = NULL; //应用程序传给回调函数的参数
broInfo.iImage = NULL; //保存被选取的文件夹的图片索引

LPITEMIDLIST pIDList = SHBrowseForFolder(&broInfo); //调用函数,打开目录选择对话框
if (pIDList== NULL)
{
AfxMessageBox(_T("获取Java安装路径出错,请联系作者!..."));
return;
}

SHGetPathFromIDList(pIDList,SelJavaPath); //获取Jaa安装目录
GlobalFree(pIDList); //释放pIDList占用的系统资源

//将Java安装目录显示在程序界面上
m_edtJavaPath.SetReadOnly(FALSE);
m_edtJavaPath.SetWindowText(SelJavaPath);
m_edtJavaPath.SetReadOnly(TRUE);
}

// 设置Java环境变量按钮
void CJavaEnvSetToolDlg::OnBnClickedBtnSetjavaenv()
{
if(m_edtJavaPath.LineLength()<3)
{
AfxMessageBox(_T("请先通过浏览按钮来选择Java的安装目录!..."));
return;
}

获取用户选择的Java安装目录
TCHAR szJavaPath[MAX_PATH]={0};
m_edtJavaPath.GetLine(0,szJavaPath,MAX_PATH);

//判断用户选择的目录是否为Java的安装目录
CFileFind fFind;
CString csJAVA_HOME=szJavaPath;
csJAVA_HOME+=_T("\\jre\\bin");
if(!fFind.FindFile(csJAVA_HOME))
{
AfxMessageBox(_T("请选择正确的Java安装目录!..."));
return;
}

//设置Java环境
if(SetJavaEnv(szJavaPath))
AfxMessageBox(_T("OK,Java运行环境设置完毕^_^!..."));
else
AfxMessageBox(_T("Sorry!~_~Java运行环境设置失败!..."));

}


// 设置Java环境变量函数,参数szJdkPath为java的安装目录
bool CJavaEnvSetToolDlg::SetJavaEnv(CString szJdkPath)
{
CRegKey EnvKey; //使用MFC提供的这个类的时候,在你的头文件(.h)或者是源文件(.cpp)里面包含atlbase.h

//打开注册表中存放环境变量的键,为向其添加键值做好准备,注意:添加键值前必须先将其打开
if(EnvKey.Open(HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment")) != ERROR_SUCCESS)
{
AfxMessageBox(_T("打开注册表失败!"));
return FALSE;
}


//设置JAVA_HOME
//EnvKey.SetValue(szJdkPath,_T("JAVA_HOME"));//此方法已过期,用以下方法来代替
EnvKey.SetStringValue(_T("JAVA_HOME"),szJdkPath);

//设置CLASSPATH
CString CLASSPATH=_T(".;%JAVA_HOME%\\lib\\dt.jar;%JAVA_HOME%\\lib\\tools.jar;%JAVA_HOME%\\jre\\lib\\rt.jar;");
//EnvKey.SetValue(CLASSPATH,_T("CLASSPATH"));//此方法已过期,用以下方法来代替
EnvKey.SetStringValue(_T("CLASSPATH"),CLASSPATH);

//设置PATH
TCHAR szPath[2048]={0};
ULONG length=2048;
//EnvKey.QueryValue(szPath, _T("Path"), &length);//此方法已过期,用以下方法来代替
EnvKey.QueryStringValue(_T("Path"),szPath,&length);
CString PATH=szPath; //获取PATH原来的值
PATH.Replace( _T("%JAVA_HOME%\\bin;%JAVA_HOME%\\jre\\bin;"), _T(""));//防止用户多次使用本工具而产生重复设置
CString newPath=_T("%JAVA_HOME%\\bin;%JAVA_HOME%\\jre\\bin;");
newPath+=PATH;
//EnvKey.SetValue(newPath,_T("Path"));//此方法已过期,用以下方法来代替
EnvKey.SetStringValue(_T("Path"),newPath);

return TRUE;
}

//卸载Java环境变量按钮
void CJavaEnvSetToolDlg::OnBnClickedBtnUnloadjavaenv()
{
CRegKey EnvKey; //使用MFC提供的这个类的时候,在你的头文件(.h)或者是源文件(.cpp)里面包含atlbase.h

//打开注册表中存放环境变量的键,为向其添加键值做好准备,注意:添加键值前必须先将其打开
if(EnvKey.Open(HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment")) != ERROR_SUCCESS)
{
AfxMessageBox(_T("打开注册表失败!"));
return;
}

//删除JAVA_HOME
EnvKey.DeleteValue(_T("JAVA_HOME"));


//删除CLASSPATH
EnvKey.DeleteValue(_T("CLASSPATH"));

//删除Path中的%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
TCHAR szPath[2048]={0};
ULONG length=2048;
//EnvKey.QueryValue(szPath, _T("Path"), &length);//此方法已过期,用以下方法来代替
EnvKey.QueryStringValue(_T("Path"),szPath,&length);
CString PATH=szPath; //获取PATH原来的值
PATH.Replace( _T("%JAVA_HOME%\\bin;%JAVA_HOME%\\jre\\bin;"), _T(""));
// EnvKey.SetValue(PATH,_T("Path"));//此方法已过期,用以下方法来代替
EnvKey.SetStringValue(_T("Path"),PATH);

AfxMessageBox(_T("OK,Java环境变量卸载完毕!"));
return;
}