Я делаю заявку, и мне нужно записать некоторые вещи в реестр, а затем отредактировать их, если это необходимо. Я пишу в 64-битный реестр, используя KEY_WOW64_64KEY. Я создал свое 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
} // ReadValues
Это работает нормально, поэтому я подумал, я просто поместил RegDeleteValue туда, и каждое значение будет удалено. К сожалению, это не то, что происходит. Этот API удалит только 2-3 значения, а затем вернет. Если я запустлю его снова, то он снова удалит 2-3 значения и вернется снова, но я не знаю почему ???? Теоретически, если я найду вейл, я могу удалить, поэтому я не понимаю, почему это происходит.
Может ли кто-нибудь помочь мне исправить мой код?
Спасибо!