关于C++删除注册表项遇到问题,含泪求助。
大家好,本人正尝试用C++编程来删除注册表的某个键及其所有子键,相关程序在MSDN上找到了,却遇到如下问题很奇怪:
RegDelnode(HKEY_LOCAL_MACHINE,
TEXT("SOFTWARE\\Test123"));就失败
RegDelnode(HKEY_CURRENT_USER,
TEXT("SOFTWARE\\Test123"));就成功
进一步试验也得出,凡是HKEY_LOCAL_MACHINE里的键值就不能删,而HKEY_CURRENT_USER里的键值就可以删除,我百思不得其解,明明删除键值的函数里的两个参数的第一个就可以在HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE等等里面选择的,怎么会选择性失明?我具体写的时候是用MFC写的,代码基本没变,附CSDN上的代码如下,大家帮忙分析一下:
#include <windows.h>
#include <stdio.h>
#include <strsafe.h>
using namespace std;
//*************************************************************
//
// RegDelnodeRecurse()
//
// Purpose: Deletes a registry key and all it's subkeys / values.
//
// Parameters: hKeyRoot - Root key
// lpSubKey - SubKey to delete
//
// Return: TRUE if successful.
// FALSE if an error occurs.
//
//*************************************************************
BOOL RegDelnodeRecurse (HKEY hKeyRoot, LPTSTR lpSubKey)
{
LPTSTR lpEnd;
LONG lResult;
DWORD dwSize;
TCHAR szName[MAX_PATH];
HKEY hKey;
FILETIME ftWrite;
// First, see if we can delete the key without having
// to recurse.
lResult = RegDeleteKey(hKeyRoot, lpSubKey);
if (lResult == ERROR_SUCCESS)
return TRUE;
lResult = RegOpenKeyEx (hKeyRoot, lpSubKey, 0, KEY_READ, &hKey);
if (lResult != ERROR_SUCCESS)
{
if (lResult == ERROR_FILE_NOT_FOUND) {
printf("Key not found.\n");
return TRUE;
}
else {
printf("Error opening key.\n");
return FALSE;
}
}
// Check for an ending slash and add one if it is missing.
lpEnd = lpSubKey + lstrlen(lpSubKey);
if (*(lpEnd - 1) != TEXT('\\'))
{
*lpEnd = TEXT('\\');
lpEnd++;
*lpEnd = TEXT('\0');
}
// Enumerate the keys
dwSize = MAX_PATH;
lResult = RegEnumKeyEx(hKey, 0, szName, &dwSize, NULL,
NULL, NULL, &ftWrite);
if (lResult == ERROR_SUCCESS)
{
do {
StringCchCopy (lpEnd, MAX_PATH*2, szName);
if (!RegDelnodeRecurse(hKeyRoot, lpSubKey)) {
break;
}
dwSize = MAX_PATH;
lResult = RegEnumKeyEx(hKey, 0, szName, &dwSize, NULL,
NULL, NULL, &ftWrite);
} while (lResult == ERROR_SUCCESS);
}
lpEnd--;
*lpEnd = TEXT('\0');
RegCloseKey (hKey);
// Try again to delete the key.
lResult = RegDeleteKey(hKeyRoot, lpSubKey);
if (lResult == ERROR_SUCCESS)
return TRUE;
return FALSE;
}
//*************************************************************
//
// RegDelnode()
//
// Purpose: Deletes a registry key and all it's subkeys / values.
//
// Parameters: hKeyRoot - Root key
// lpSubKey - SubKey to delete
//
// Return: TRUE if successful.
// FALSE if an error occurs.
//
//*************************************************************
BOOL RegDelnode (HKEY hKeyRoot, LPTSTR lpSubKey)
{
TCHAR szDelKey[2 * MAX_PATH];
StringCchCopy (szDelKey, MAX_PATH*2, lpSubKey);
return RegDelnodeRecurse(hKeyRoot, szDelKey);
}
void main()
{
BOOL bSuccess;
bSuccess = RegDelnode(HKEY_CURRENT_USER,
TEXT("Software\\TestDir"));
if(bSuccess)
printf("Success!\n");
else printf("Failure.\n");
}
RegDelnode(HKEY_LOCAL_MACHINE,
TEXT("SOFTWARE\\Test123"));就失败
RegDelnode(HKEY_CURRENT_USER,
TEXT("SOFTWARE\\Test123"));就成功
进一步试验也得出,凡是HKEY_LOCAL_MACHINE里的键值就不能删,而HKEY_CURRENT_USER里的键值就可以删除,我百思不得其解,明明删除键值的函数里的两个参数的第一个就可以在HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE等等里面选择的,怎么会选择性失明?我具体写的时候是用MFC写的,代码基本没变,附CSDN上的代码如下,大家帮忙分析一下:
#include <windows.h>
#include <stdio.h>
#include <strsafe.h>
using namespace std;
//*************************************************************
//
// RegDelnodeRecurse()
//
// Purpose: Deletes a registry key and all it's subkeys / values.
//
// Parameters: hKeyRoot - Root key
// lpSubKey - SubKey to delete
//
// Return: TRUE if successful.
// FALSE if an error occurs.
//
//*************************************************************
BOOL RegDelnodeRecurse (HKEY hKeyRoot, LPTSTR lpSubKey)
{
LPTSTR lpEnd;
LONG lResult;
DWORD dwSize;
TCHAR szName[MAX_PATH];
HKEY hKey;
FILETIME ftWrite;
// First, see if we can delete the key without having
// to recurse.
lResult = RegDeleteKey(hKeyRoot, lpSubKey);
if (lResult == ERROR_SUCCESS)
return TRUE;
lResult = RegOpenKeyEx (hKeyRoot, lpSubKey, 0, KEY_READ, &hKey);
if (lResult != ERROR_SUCCESS)
{
if (lResult == ERROR_FILE_NOT_FOUND) {
printf("Key not found.\n");
return TRUE;
}
else {
printf("Error opening key.\n");
return FALSE;
}
}
// Check for an ending slash and add one if it is missing.
lpEnd = lpSubKey + lstrlen(lpSubKey);
if (*(lpEnd - 1) != TEXT('\\'))
{
*lpEnd = TEXT('\\');
lpEnd++;
*lpEnd = TEXT('\0');
}
// Enumerate the keys
dwSize = MAX_PATH;
lResult = RegEnumKeyEx(hKey, 0, szName, &dwSize, NULL,
NULL, NULL, &ftWrite);
if (lResult == ERROR_SUCCESS)
{
do {
StringCchCopy (lpEnd, MAX_PATH*2, szName);
if (!RegDelnodeRecurse(hKeyRoot, lpSubKey)) {
break;
}
dwSize = MAX_PATH;
lResult = RegEnumKeyEx(hKey, 0, szName, &dwSize, NULL,
NULL, NULL, &ftWrite);
} while (lResult == ERROR_SUCCESS);
}
lpEnd--;
*lpEnd = TEXT('\0');
RegCloseKey (hKey);
// Try again to delete the key.
lResult = RegDeleteKey(hKeyRoot, lpSubKey);
if (lResult == ERROR_SUCCESS)
return TRUE;
return FALSE;
}
//*************************************************************
//
// RegDelnode()
//
// Purpose: Deletes a registry key and all it's subkeys / values.
//
// Parameters: hKeyRoot - Root key
// lpSubKey - SubKey to delete
//
// Return: TRUE if successful.
// FALSE if an error occurs.
//
//*************************************************************
BOOL RegDelnode (HKEY hKeyRoot, LPTSTR lpSubKey)
{
TCHAR szDelKey[2 * MAX_PATH];
StringCchCopy (szDelKey, MAX_PATH*2, lpSubKey);
return RegDelnodeRecurse(hKeyRoot, szDelKey);
}
void main()
{
BOOL bSuccess;
bSuccess = RegDelnode(HKEY_CURRENT_USER,
TEXT("Software\\TestDir"));
if(bSuccess)
printf("Success!\n");
else printf("Failure.\n");
}
...全文
相关推荐
删除注册表项的操作(C++)
该代码实现注册表某一子项删除的操作,而非仅仅键值删除操作。
C++删除注册表项及其所有子项的方法(附完整源码)
C++删除注册表项及其所有子项的方法(附完整源码)。
WINCE平台注册表编辑实战:新建、修改、删除注册表项全流程详解
WINCE系统中注册表的管理依赖于一套完整的注册表操作API,开发者通过这些函数可以实现注册表项的创建、读取、修改与删除。本章将系统介绍这些API函数的使用方式,重点分析核心函数的调用逻辑、参数含义、返回值处理方式,并深入探讨WINCE平台中注册表权限控制机制的设计与实现,为后续章节的编程实践提供基础支撑。WINCE系统支持的注册表操作API与桌面Windows系统类似,但存在一些平台差异和功能限制。掌握这些API的基本结构和使用流程是高效开发注册表相关功能的前提。
c++ 文件自删除 程序自删除
文件自删除一般用于卸载程序 实现:设置本进程为实时执行,快速退出。调用cmd传入参数以删除自己。
C++写注册表项实例
主要介绍了C++写注册表项实例,可实现开机启动的功能,是进行Windows桌面应用程序开发中非常重要的技巧,需要的朋友可以参考下


资源
