Windows定义了一个文件路径的最长长度的常量MAX_PATH(值为260),我们可以用它来建立字符串缓冲区;
CRegKey提供了对系统注册表的操作方法,通过CRegKey类,可以方便的
打开注册表的某个分支或子键 CRegKey::Open
修改一个键的键值 CRegKey::SetValue
查询某个键的键值 CRegKey::QueryValue
操作完成之后,关闭子键 CRegKey::Close
要想使用CRegKey类,需要包含头文件atlbase.h
2.常用操作方法
LONG Open( HKEY hKeyParent, LPCTSTR lpszKeyName, REGSAM samDesired = KEY_ALL_ACCESS );
LONG QueryValue( DWORD& dwValue, LPCTSTR lpszValueName );
LONG QueryValue( LPTSTR szValue, LPCTSTR lpszValueName, DWORD* pdwCount )
LONG SetValue( DWORD dwValue, LPCTSTR lpszValueName );
LONG SetValue( LPCTSTR lpszValue, LPCTSTR lpszValueName = NULL );
LONG SetValue( HKEY hKeyParent, LPCTSTR lpszKeyName, LPCTSTR lpszValue, LPCTSTRlpszValueName = NULL );
LONG DeleteValue( LPCTSTR lpszValue );
LONG Create( HKEY hKeyParent, LPCTSTR lpszKeyName, LPTSTR lpszClass = REG_NONE, DWORDdwOptions = REG_OPTION_NON_VOLATILE, REGSAMsamDesired = KEY_ALL_ACCESS, LPSECURITY_ATTRIBUTESlpSecAttr = NULL, LPDWORDlpdwDisposition = NULL );
LONG DeleteSubKey( LPCTSTR lpszSubKey );
LONG Close( );
LONG RegFlushKey( HKEY hKey );
3、常见应用
获取系统注册用户名(系统安装时名称)
void CSystemInfoDlg::OnBtnRegName()
{
// TODO: Add your control notification handler code here
CString strPath="SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion";
//注册表子键路径
CRegKey regKey;//定义注册表类对象
LONG lResult;//LONG型变量——反应结果
lResult=regKey.Open(HKEY_LOCAL_MACHINE,LPCTSTR(strPath),KEY_ALL_ACCESS);//读取键值成功返回ERROR_SUCCESS
//打开注册表主键
if (lResult!=ERROR_SUCCESS)//读取键值不成功
{
AfxMessageBox("错误:无法查询有关的注册表信息");
return;
}
char chRegisteredName[30];
DWORD dwSize=30;
regKey.QueryValue(chRegisteredName,"RegisteredOwner",&dwSize);
//获取RegisteredOwner的值
m_strRegOwner=chRegisteredName;
UpdateData(FALSE);
regKey.Close();//关闭注册表
}
LONG QueryValue( LPTSTR szValue, LPCTSTR lpszValueName, DWORD* pdwCount )
szValue:字符串数据类型的键值
lpszValueName:所读取键值项的名称
pdwCount:字符串大小
成功读取注册表中某键值项的键值,成功返回ERROR_SUCCESS;失败返回错误值
注意第三个参数,为存储该键值的大小,应根据实际情况设定比较合理的空间,这里为30个字符。
获取系统注册用户名
获取HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion子键中获取RegisteredOwner的键值。
获取注册单位名
void CSystemInfoDlg::OnButton1()
{
CRegKey regKey;
CString strPath="SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion";
LONG lResult;
lResult=regKey.Open(HKEY_LOCAL_MACHINE,LPCTSTR(strPath),KEY_ALL_ACCESS);
if (lResult!=ERROR_SUCCESS)
{
AfxMessageBox("错误:无法查询有关的注册表信息");
return;
}
char chRegisteredName[30];
DWORD dwSize=30;
regKey.QueryValue(chRegisteredName,"RegisteredOrganization",&dwSize);
//获取RegisteredOwner的值
m_strRegisteredOrganization=chRegisteredName;
UpdateData(FALSE);
regKey.Close();//关闭注册表
}
获取HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion子键中获取RegisteredOrganization的键值。
获取操作系统安装序列号
获取HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion子键中获取ProductName的键值。
void CSystemInfoDlg::OnButton4()
{
CString strPath="SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion";
CRegKey regKey;
LONG lResult;
lResult=regKey.Open(HKEY_LOCAL_MACHINE,LPCTSTR(strPath),KEY_ALL_ACCESS);
if (lResult!=ERROR_SUCCESS)
{
AfxMessageBox("错误:无法查询有关的注册表信息");
return;
}
char chProductName[50];
DWORD dwSize=50;
regKey.QueryValue(chProductName,"ProductName",&dwSize);
m_strProductName=chProductName;
UpdateData(FALSE);
regKey.Close();
}
获取IE版本号
获取HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer子键中获取Version的键值。
void CSystemInfoDlg::OnButton5()
{
CString strPath="SOFTWARE\\Microsoft\\Internet Explorer";
CRegKey regKey;
LONG lResult;
lResult=regKey.Open(HKEY_LOCAL_MACHINE,LPCTSTR(strPath),KEY_ALL_ACCESS);
if (lResult!=ERROR_SUCCESS)
{
AfxMessageBox("错误:无法查询有关的注册表信息");
return;
}
char chIEVersion[50];
DWORD dwSize=50;
regKey.QueryValue(chIEVersion,"Version",&dwSize);
m_strIEVersion=chIEVersion;
UpdateData(FALSE);
regKey.Close();
}
获取Windows的版本号
获取HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion子键中获取CurrentVersion的键值。
void CSystemInfoDlg::OnButton6()
{
CString strPath="SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion";
CRegKey regKey;
LONG lResult;
lResult=regKey.Open(HKEY_LOCAL_MACHINE,LPCTSTR(strPath),KEY_ALL_ACCESS);
if (lResult!=ERROR_SUCCESS)
{
AfxMessageBox("错误:无法查询有关的注册表信息");
return;
}
char chCurrentVersion[50];
DWORD dwSize=50;
regKey.QueryValue(chCurrentVersion,"CurrentVersion",&dwSize);
m_strCurrentVersion=chCurrentVersion;
UpdateData(FALSE);
regKey.Close();
}
通过GetVersionEx()函数可以得到OSVERSIONINFO数据结构,该结构中的dwMajorVersion与dwMinorVersion即是版本号(主副版本号)
获取Windows内建号
void CSystemInfoDlg::OnButtonBuildNumber()
{
CString strPath="SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion";
CRegKey regKey;
LONG lResult;
lResult=regKey.Open(HKEY_LOCAL_MACHINE,LPCTSTR(strPath),KEY_ALL_ACCESS);
if (lResult!=ERROR_SUCCESS)
{
AfxMessageBox("错误:无法查询有关的注册表信息");
return;
}
char chCurrentBuildNumber[50];
DWORD dwSize=50;
regKey.QueryValue(chCurrentBuildNumber,"CurrentBuildNumber",&dwSize);
m_strBuildNo=chCurrentBuildNumber;
UpdateData(FALSE);
regKey.Close();
}
获取Windows的版本名称
void CSystemInfoDlg::OnBtnCsdVersion()
{
CString strPath="SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion";
CRegKey regKey;
LONG lResult;
lResult=regKey.Open(HKEY_LOCAL_MACHINE,LPCTSTR(strPath),KEY_ALL_ACCESS);
if (lResult!=ERROR_SUCCESS)
{
AfxMessageBox("错误:无法查询有关的注册表信息");
return;
}
char chCSDVersion[50];
DWORD dwSize=50;
regKey.QueryValue(chCSDVersion,"CSDVersion",&dwSize);
m_strCSDVersion=chCSDVersion;
UpdateData(FALSE);
regKey.Close();
}
通过GetVersionEx()函数可以得到OSVERSIONINFO数据结构,该结构中的CSDVersion即是Windows的版本名称
获取桌面文件夹的位置
获取HKEY_CURRENT_USER\software\Microsoft\Windows\Explorer\Shell Folders子键中获取Desktop的键值。
void CSystemInfoDlg::OnButton9()
{
CString strPath="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders";
CRegKey regKey;
LONG lResult;
lResult=regKey.Open(HKEY_CURRENT_USER,LPCTSTR(strPath),KEY_ALL_ACCESS);
if (lResult!=ERROR_SUCCESS)
{
AfxMessageBox("错误:无法查询有关的注册表信息");
return;
}
char chDesktop[50];
DWORD dwSize=50;
regKey.QueryValue(chDesktop,"Desktop",&dwSize);
m_strDesktopDir=chDesktop;
UpdateData(FALSE);
regKey.Close();
}
获取字体文件夹的位置
获取HKEY_CURRENT_USER\software\Microsoft\Windows\Explorer\Shell Folders子键中获取Fonts的键值。
void CSystemInfoDlg::OnButtonFont()
{
CString strPath="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders";
CRegKey regKey;
LONG lResult;
lResult=regKey.Open(HKEY_CURRENT_USER,LPCTSTR(strPath),KEY_ALL_ACCESS);
if (lResult!=ERROR_SUCCESS)
{
AfxMessageBox("错误:无法查询有关的注册表信息");
return;
}
char chFonts[50];
DWORD dwSize=50;
regKey.QueryValue(chFonts,"Fonts",&dwSize);
m_strFonts=chFonts;
UpdateData(FALSE);
regKey.Close();
}
获取网上邻居文件夹的位置
获取HKEY_CURRENT_USER\software\Microsoft\Windows\Explorer\Shell Folders子键中获取NetHood的键值。
void CSystemInfoDlg::OnButton8()
{
CString strPath="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders";
CRegKey regKey;
LONG lResult;
lResult=regKey.Open(HKEY_CURRENT_USER,LPCTSTR(strPath),KEY_ALL_ACCESS);
if (lResult!=ERROR_SUCCESS)
{
AfxMessageBox("错误:无法查询有关的注册表信息");
return;
}
char chNetHood[50];
DWORD dwSize=50;
regKey.QueryValue(chNetHood,"NetHood",&dwSize);
m_strNetHood=chNetHood;
UpdateData(FALSE);
regKey.Close();
}
获取“我的文档”文件夹的位置
获取HKEY_CURRENT_USER\software\Microsoft\Windows\Explorer\Shell Folders子键中获取Personal的键值。
void CSystemInfoDlg::OnButton10()
{
CString strPath="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders";
CRegKey regKey;
LONG lResult;
lResult=regKey.Open(HKEY_CURRENT_USER,LPCTSTR(strPath),KEY_ALL_ACCESS);
if (lResult!=ERROR_SUCCESS)
{
AfxMessageBox("错误:无法查询有关的注册表信息");
return;
}
char chMyDoc[50];
DWORD dwSize=50;
regKey.QueryValue(chMyDoc,"Personal",&dwSize);
m_strPersonal=chMyDoc;
UpdateData(FALSE);
regKey.Close();
}