VC6中没有提供删除带有子键的注册表键,而最新的.net则提供了这个函数。不过很多程序还是用VC6写的。
我就发个自己弄出来的代码:
测试绝对能用!
/***
*DeleteSubKeyTree(HKEY hKey, LPCTSTR lpSubKey)
* 功能: 递归删除注册表子键
* 入口:
* hKey : 一个HEKY类型的参数,比如HKEY_CLASSES_ROOT
* lpSubKey: 比如".exe"
* 出口: 成功删除,返回ERROR_SUCCESS,失败则返回一个非0值。
*
* 实例: LPCTSTR lpSubKey= "shile";
HKEY hKey = HKEY_CLASSES_ROOT;
long ret;
ret = DeleteSubKeyTree(hKey, lpSubKey);
if (ret == ERROR_SUCCESS)
{
SetDlgItemText(IDC_STATIC, "删除子键HKEY_CLASSES_ROOT//shile成功");
}
*
**************************************************/
DeleteSubKeyTree(HKEY hKey, LPCTSTR lpSubKey)
{
LONG lResult;
HKEY hSubKey;
DWORD dwIndex, cbName;
char szSubKey[512];
FILETIME ft;
lResult = RegOpenKeyEx(hKey, lpSubKey, 0, KEY_ALL_ACCESS,&hSubKey);
if (lResult != ERROR_SUCCESS)
{
RegCloseKey(hSubKey);
return lResult;
}
dwIndex = 0;
cbName = sizeof(szSubKey)/sizeof(szSubKey[0]);
while (ERROR_SUCCESS == (lResult = RegEnumKeyEx(hSubKey, dwIndex, szSubKey, &cbName, NULL, NULL, NULL, &ft)))
{
DeleteSubKeyTree(hSubKey, szSubKey);
}
RegCloseKey(hSubKey);
lResult = RegDeleteKey(hKey, lpSubKey);
return lResult;
}
文章出处:http://www.diybl.com/course/3_program/c++/cppxl/20081119/152041.html
这个代码有问题,以下的可以用:
原文链接:http://blog.csdn.net/sding/archive/2008/12/14/3514562.aspx
///////////////////////////////////////////////////////////////////////////
// DeleRegTree.cpp : Defines the entry point for the console application.
// Author: sDing 2008-12-14
////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include <windows.h>
#include <iostream>
using namespace std;
DWORD DeleteTree(HKEY RootKey, const char *pSubKey)
{
HKEY hKey;
DWORD nRet;
DWORD NameCnt,NameMaxLen;
DWORD KeyCnt,KeyMaxLen,MaxDateLen;
static char sFormat[256] = "";
strcat(sFormat, "----");
static int dwDeep = -1;
dwDeep++;
nRet=RegOpenKeyEx(RootKey,pSubKey,0,KEY_ALL_ACCESS,&hKey);
if(nRet!=ERROR_SUCCESS)
{
cout<<"can't open the regedit";
return 0;
}
nRet = RegQueryInfoKey(hKey,NULL,NULL,NULL,&KeyCnt,&KeyMaxLen,NULL,&NameCnt,
&NameMaxLen,&MaxDateLen,NULL,NULL);
if(nRet == ERROR_SUCCESS)
{
for(int dwIndex = KeyCnt - 1; dwIndex >= 0; dwIndex--) //枚举键值
{
char sKeyName[256] = "";
RegEnumKey(hKey, dwIndex, sKeyName, sizeof(sKeyName));
HKEY hKeySub;
DWORD KeyCntSub;
char pSubKeyTemp[256] = "";
strcpy(pSubKeyTemp, pSubKey);
strcat(pSubKeyTemp, "//");
strcat(pSubKeyTemp, sKeyName);
nRet = RegOpenKeyEx(RootKey,pSubKeyTemp,0,KEY_ALL_ACCESS,&hKeySub);
if(nRet == ERROR_SUCCESS)
{
nRet = RegQueryInfoKey(hKeySub,NULL,NULL,NULL,&KeyCntSub,&KeyMaxLen,NULL,&NameCnt,
&NameMaxLen,&MaxDateLen,NULL,NULL);
if(nRet == ERROR_SUCCESS)
{
if (KeyCntSub != 0)
{
DeleteTree(RootKey, pSubKeyTemp);
}
RegCloseKey(hKeySub);
}
}
// cout << sFormat << sKeyName << endl;
RegDeleteKey(RootKey ,pSubKeyTemp);
}
RegCloseKey(hKey);
}
// sFormat[strlen(sFormat) - 4] = 0;
if (dwDeep == 0)
{
RegDeleteKey(RootKey ,pSubKey);
}
return 0;
}
int main(int argc, char* argv[])
{
DeleteTree(HKEY_LOCAL_MACHINE, "SYSTEM//CurrentControlSet//Control//SafeBoot//Minimal");
system("pause");
return 0;
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/woyaowenzi/archive/2009/02/03/3861049.aspx