gpt4 book ai didi

c - XP下如何删除64位注册表?

转载 作者:可可西里 更新时间:2023-11-01 11:37:32 27 4
gpt4 key购买 nike

我正在制作一个应用程序,我需要在注册表中写一些东西,如果需要的话稍后再编辑它们。我正在使用 KEY_WOW64_64KEY 写入 64 位注册表。我创建了我的 Key Software\MyApp,这里还有一些其他值 5 或 6。我的问题如下。我有以下代码来读取键下的每个值

void ReadAndDeleteValues( HKEY hKey )
{

//TCHAR achKey[ MAX_KEY_LENGTH ]; // buffer for subkey name
//DWORD cbName; // size of name string
TCHAR achClass[ MAX_PATH ] = TEXT(""); // buffer for class name
DWORD cchClassName = MAX_PATH; // size of class string
DWORD cSubKeys=0; // number of subkeys
DWORD cbMaxSubKey; // longest subkey size
DWORD cchMaxClass; // longest class string
DWORD cValues; // number of values for key
DWORD cchMaxValue; // longest value name
DWORD cbMaxValueData; // longest value data
DWORD cbSecurityDescriptor; // size of security descriptor
FILETIME ftLastWriteTime; // last write time

DWORD i, retCode;

TCHAR achValue[ MAX_VALUE_NAME ];
DWORD cchValue = MAX_VALUE_NAME;

// Get the class name and the value count.
retCode = RegQueryInfoKey(
hKey, // key handle
achClass, // buffer for class name
&cchClassName, // size of class string
NULL, // reserved
&cSubKeys, // number of subkeys
&cbMaxSubKey, // longest subkey size
&cchMaxClass, // longest class string
&cValues, // number of values for this key
&cchMaxValue, // longest value name
&cbMaxValueData, // longest value data
&cbSecurityDescriptor, // security descriptor
&ftLastWriteTime // last write time
);

if ( cValues > 0 ) printf( "\nNumber of values: %d\n", cValues );

for ( i = 0, retCode = ERROR_SUCCESS; i < cValues; i++ )
{
cchValue = MAX_VALUE_NAME;
achValue[ 0 ] = '\0';

retCode = RegEnumValue( hKey,
i,
achValue,
&cchValue,
NULL,
NULL,
NULL,
NULL
);

if ( retCode == ERROR_SUCCESS )
{

DWORD cbData = 8192;
DWORD dwRet;
DWORD type = 0;
wchar_t PerfData[ 2048 ] = { 0 };

memset( PerfData, 0, wcslen( PerfData ) );

dwRet = RegQueryValueEx( hKey,
achValue,
NULL,
&type,
( LPBYTE )PerfData,
&cbData
);

if ( dwRet == ERROR_SUCCESS ) ;//do nothing
else printf( "\n\nRegQueryValueEx Failed!" );

_tprintf( TEXT( "\n #%.3d - [ %-30s ]" ), i + 1, achValue );

RegDeleteValue( hKey, achValue );

}//if
}//for

}//读取值

它工作正常,所以我想,我只是将 RegDeleteValue 放在那里,每个值都将被删除。不幸的是,这不是正在发生的事情。此 API 将仅删除 2-3 个值,然后返回。如果我再次运行它,它会再次删除 2-3 个值并再次返回,但我不知道为什么????理论上,如果我找到一个谷,我可以删除,所以我不明白,为什么会这样。

有人可以帮我更正我的代码吗?

谢谢!

最佳答案

由于典型的“从数组中删除”错误,您的程序只删除了几个值,就像在这个伪代码中一样:

// this program will not remove all elements
for (int i = 0, n = arraySize; i < n; ++i)
array_remove(array, i);

// step 1, i=0: 1 2 3 4 5 6
// ^ removed
// step 2, i=1: 2 3 4 5 6
// ^ removed
// step 3, i=2: 2 4 5 6
// ^ removed
// step 4, i=3: 2 4 6
// ^ RegEnumValue returns error and the loop exits

正确的方法应该是这样的:

while (cValues > 0) {
/* delete registry value at index 0 */
--cValues;
}

要快速修复您的代码,请将 RegEnumValue() 的第二个参数替换为 0

关于c - XP下如何删除64位注册表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7598797/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com