vc++注册表操作

来源:互联网 发布:windows脚本有哪些 编辑:程序博客网 时间:2024/06/05 09:23

 

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);

原创粉丝点击