1.新建项
例如:在HKEY_LOCAL_MACHINE/SOFTWARE/下新建一个项YanTai,再在YanTai下新建一个项BandSoft
HKEY hSoftKey;
HKEY hPlaceKey;
HKEY hCompanyKey;
//打开HKEY_LOCAL_MACHINE/SOFTWARE
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("software"), 0, KEY_WRITE|KEY_READ,
&hSoftKey) == ERROR_SUCCESS)
{
DWORD dw;
//创建并打开HKEY_LOCAL_MACHINE/SOFTWARE/YanTai
if (RegCreateKeyEx(hSoftKey, _T("YanTai"), 0, REG_NONE,
REG_OPTION_NON_VOLATILE, KEY_WRITE|KEY_READ, NULL,
&hPlaceKey, &dw) == ERROR_SUCCESS)
{
//创建并打开HKEY_LOCAL_MACHINE/SOFTWARE/YanTai/BandSoft
if(RegCreateKeyEx(hPlaceKey,_T("BandSoft"),0,REG_NONE,
REG_OPTION_NON_VOLATILE,KEY_WRITE|KEY_READ,NULL,
&hCompanyKey,&dw) == ERROR_SUCCESS)
{
RegCloseKey(hSoftKey);
RegCloseKey(hPlaceKey);
RegCloseKey(hCompanyKey);
}
}
}
---------------------------------------------------------------------------
2.在项下新建字符串值
例如在项BandSoft下新建字符串值 名称:ProductName 类型REG_SZ,数据:FD900 System
紧接上面的代码:
HKEY hCompanyKey;
//打开HKEY_LOCAL_MACHINE/SOFTWARE/YanTai/BandSoft
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("software//YanTai//BandSoft"), 0, KEY_WRITE|KEY_READ,&hCompanyKey)==ERROR_SUCCESS)
{
CString str = "FD900 System";
//加1为字符串最后的空字符/0留空间
LPBYTE lpData = new BYTE[str.GetLength()+1];
for(int i = 0; i < str.GetLength(); i++)
{
*(lpData+i) = str.GetAt(i);
}
DWORD cbData = str.GetLength()+1;
//新建值
if(RegSetValueEx(hCompanyKey,_T("ProductName"),0,REG_SZ,lpData,cbData) != ERROR_SUCCESS)
MessageBox("error");
delete [] lpData;
}
else
MessageBox("error");
RegCloseKey(hCompanyKey);
------------------------------------------------------------------
3.在项下新建REG_DWORD类型的值
例如在项BandSoft下新建DWORD类型的值 名称:Number ,类型REG_DWORD ,数据:2
HKEY hPlaceKey;
HKEY hCompanyKey;
DWORD dw;
if(ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("SOFTWARE//YanTai"),0,KEY_WRITE,&hPlaceKey))
MessageBox("error");
//打开HKEY_LOCAL_MACHINE/SOFTWARE/YanTai/BandSoft,如果BandSoft项没有,则创建
if(ERROR_SUCCESS != RegCreateKeyEx(hPlaceKey,"BandSoft",0,REG_NONE,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hCompanyKey,&dw))
MessageBox("error");
//在项BandSoft下新建DWORD类型的值 名称:Number 类型REG_DWORD ,数据:2
DWORD dwValue = 2;
char szName[] = "Number";
if(ERROR_SUCCESS != RegSetValueEx(hCompanyKey,szName,0,REG_DWORD,(LPBYTE)&dwValue,sizeof(dwValue)))
MessageBox("error");
RegCloseKey(hPlaceKey);
RegCloseKey(hCompanyKey);
可以从注册表中看到BandSoft项下名称为:Number ,类型REG_DWORD ,数据:0x00000002(2)
-----------------------------------------------------------------------------------------
5.查询项下的字符串值
例如查询 项BandSoft下 字符串ProductName的值.
HKEY hCompanyKey;
//打开HKEY_LOCAL_MACHINE/SOFTWARE/YanTai/BandSoft
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("software//YanTai//BandSoft"), 0,
KEY_WRITE|KEY_READ,&hCompanyKey)==ERROR_SUCCESS)
{
LPBYTE lpData = new BYTE[80];
DWORD cbData = 80;
DWORD dwType = REG_SZ;
if(RegQueryValueEx(hCompanyKey,"ProductName",0,&dwType,lpData,&cbData)
== ERROR_SUCCESS)
{
//将lpData 转换成CString 类型
CString strValue;
strValue = CString(lpData);
//strValue就是你想要查询的值
MessageBox(strValue);//输出FD900 System
}
else
MessageBox("error");
delete [] lpData;
}
else
MessageBox("error");
RegCloseKey(hCompanyKey);
-------------------------------------------------------------------------------------
6.枚举项下所有的键值
例如:枚举启动项下HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Run下所有键值,
并用list box控件显示出来:
CListBox m_list;
HKEY hAutoRunKey;
DWORD dwIndex = 0;
long lResult;
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("SOFTWARE//Microsoft//Windows//CurrentVersion//Run"),
0,KEY_READ,&hAutoRunKey) == ERROR_SUCCESS)
{
char szName[100];
DWORD cbName = 100;
char szValue[100];
DWORD cbValue = 100;
CString strTemp;
lResult = RegEnumValue(hAutoRunKey,dwIndex,szName,&cbName,0,NULL,(LPBYTE)szValue,&cbValue);
while(lResult == ERROR_SUCCESS && lResult != ERROR_NO_MORE_ITEMS)
{
strTemp.Format("Name: %s Value : %s",szName,szValue);
m_list.AddString(strTemp);
dwIndex = dwIndex + 1;
//注意一定要给cbName,cbValue重新赋值,因为其值已变,自已这个错误找了一天才找到
cbName = 100;
cbValue = 100;
lResult = RegEnumValue(hAutoRunKey,dwIndex,szName,&cbName,0,NULL,(LPBYTE)szValue,&cbValue);
}
}
else
{
MessageBox("error");
}
RegCloseKey(hAutoRunKey);
---------------------------------------------------------------------------------
7.枚举项下所有的子项
例如枚举HKEY_LOCAL_MACHINE/SOFTWARE项下所有的子项,并用list box控件显示出来
CListBox m_list
HKEY hKey;
DWORD dwIndex = 0;
long lResult;
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("SOFTWARE"),
0,KEY_READ,&hKey) == ERROR_SUCCESS)
{
char szKeyName[100];
DWORD cbName = 100;
lResult = RegEnumKeyEx(hKey,dwIndex,szKeyName,&cbName,0,NULL,NULL,NULL);
while(lResult == ERROR_SUCCESS && lResult != ERROR_MORE_DATA)
{
m_list.AddString(szKeyName);
dwIndex = dwIndex + 1;
//注意一定要给cbName重新赋值,因为其值已变,否则导致下一个RegEumKeyEx错误
cbName = 100;
lResult = RegEnumKeyEx(hKey,dwIndex,szKeyName,&cbName,0,NULL,NULL,NULL);
}
}
else
{
MessageBox("error");
}
RegCloseKey(hKey);
-------------------------------------------------------------------------------
8.删除项下的键值
例如删除启动项HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Run下
的键名为jfproc
HKEY hAutoRunKey;
//打开HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Run
if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("SOFTWARE//Microsoft//Windows//CurrentVersion//Run"),
0,KEY_WRITE,&hAutoRunKey))
{
char szValue[]="jfproc";
if(RegDeleteValue(hAutoRunKey,szValue) != ERROR_SUCCESS)
MessageBox("error");
}
else
MessageBox("error");
RegCloseKey(hAutoRunKey);
-----------------------------------------------------------------
9.删除项(只适用于此项下无子项的情况)
例如删除HKEY_LOCAL_MACHINE/SOFTWARE/YanTai/下的项BandSoft
HKEY hKey;
//打开HKEY_LOCAL_MACHINE/SOFTWARE/YanTai
if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("SOFTWARE//YanTai"),
0,KEY_WRITE,&hKey))
{
char szKey[]="BandSoft";
if(RegDeleteKey(hKey,szKey) != ERROR_SUCCESS)
MessageBox("error");
}
else
MessageBox("error");
RegCloseKey(hKey);
------------------------------------------------------------------------
10.删除项(此项下有子项的情况也适用)
编程思想:
先删除此项下所有的子项,再删除此项,由下向上删.
利用RegDeleteKey删除项(项中有子项)时返回值不为ERROR_SUCCESS,
对于项中无键值的项是否应该用SHDeleteEmptyKey,我觉得没必要,用RegDeleteKey即可,
因为注册表每个项中必带一个缺省的名称为空,数据类型:REG_SZ,值也为空字符串的键值.
自定义的删除项的函数
BOOL DeleteKey(HKEY hKey, char *szSubKey)
{
if(ERROR_SUCCESS == RegDeleteKey(hKey,szSubKey))
return true;
//打开项
HKEY hSubKey;
//不仅要KEY_WRITE权限,而且枚举子项时要用到KEY_READ权限,自已为这个错找了半天.
if(RegOpenKeyEx(hKey,szSubKey,0,KEY_WRITE|KEY_READ,&hSubKey) != ERROR_SUCCESS)
return false;
//删除项下的子项
DWORD dwIndex = 0;
long lResult;
char szName[100];
DWORD cbName = 100;
lResult = RegEnumKeyEx(hSubKey,dwIndex,szName,&cbName,0,NULL,NULL,NULL);
while(lResult == ERROR_SUCCESS && lResult != ERROR_MORE_DATA)
{
//recursively delete key
DeleteKey(hSubKey,szName);
//注意一定要给cbName重新赋值,因为其值已变,否则导致下一个RegEumKeyEx错误
cbName = 100;
//千万不要犯加上dwIndex = dwIndex + 1;这样的错误,
//因为第一个子顶删除后,第二个子项又变为了第一个子项,永远保持dwIndex=0,
//自已就犯这个错误,调试了半天才找到答案
lResult = RegEnumKeyEx(hSubKey,dwIndex,szName,&cbName,0,NULL,NULL,NULL);
}
RegCloseKey(hSubKey);
//项下的子项删除后,现在可以删除项了
RegDeleteKey(hKey,szSubKey);
return true;
}
使用例子:对于HKEY_LOCAL_MACHINE/SOFTWARE/YanTai/BandSoft中的YanTai项来说,
YanTai项下有子项BandSoft,所以删除YanTai项要用到上面的自定义的DeleteKey函数,代码如下:
HKEY hKey;
//打开HKEY_LOCAL_MACHINE/SOFTWARE
if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("SOFTWARE"),
0,KEY_WRITE,&hKey))
{
if(!DeleteKey(hKey,"YanTai"))
MessageBox("error");
}
else
MessageBox("error");
RegCloseKey(hKey);