Tôi đang tạo một ứng dụng và tôi cần viết một số nội dung vào sổ đăng ký và chỉnh sửa chúng sau nếu cần. Tôi đang sử dụng KEY_WOW64_64KEY để ghi vào sổ đăng ký 64-bit. Tôi đã tạo Key Software\MyApp của mình và có một số giá trị khác 5 hoặc 6 ở đây. Câu hỏi của tôi như sau. Tôi có đoạn mã sau để đọc từng giá trị dưới khóa
void ReadAndDeleteValues(HKEY hKey)
{
//TCHAR achKey[ MAX_KEY_LENGTH ] // vùng đệm cho tên khóa con
//DWORD cbName; // kích thước của chuỗi tên
TCHAR achClass[MAX_PATH] = TEXT(""); // vùng đệm cho tên lớp
DWORD cchClassName = MAX_PATH // kích thước của chuỗi lớp
DWORD cSubKeys=0; // số lượng khóa con
DWORD cbMaxSubKey // kích thước khóa con dài nhất
DWORD cchMaxClass // chuỗi lớp dài nhất
cValues DWORD; // số giá trị cho khóa
DWORD cchMaxValue; // tên giá trị dài nhất
DWORD cbMaxValueData // dữ liệu có giá trị dài nhất
DWORD cbSecurityDescriptor // kích thước của bộ mô tả bảo mật;
FILETIME ftLastWriteTime; // lần ghi cuối cùng
DWORD i, retCode;
TCHARachValue[MAX_VALUE_NAME];
DWORD cchValue = MAX_VALUE_NAME;
// Lấy tên lớp và số lượng giá trị.
retCode = RegQueryInfoKey(
hKey, // tay cầm phím
achClass, // vùng đệm cho tên lớp
&cchClassName, // kích thước của chuỗi lớp
NULL, // dành riêng
&cSubKeys, // số lượng khóa con
&cbMaxSubKey, // kích thước khóa con dài nhất
&cchMaxClass, // chuỗi lớp dài nhất
&cValues, // số giá trị cho khóa này
&cchMaxValue, // tên giá trị dài nhất
&cbMaxValueData, // dữ liệu có giá trị dài nhất
&cbSecurityDescriptor, // bộ mô tả bảo mật
&ftLastWriteTime // lần ghi cuối cùng
);
if ( cValues > 0 ) printf( "\nSố giá trị: %d\n", cValues );
cho ( i = 0, retCode = ERROR_SUCCESS; i < cValues; i++ )
{
cchValue = MAX_VALUE_NAME;
achValue[ 0 ] = '\0';
retCode = RegEnumValue(hKey,
Tôi,
achValue,
&cchValue,
NULL,
NULL,
NULL,
NULL
);
nếu ( retCode == ERROR_SUCCESS )
{
DWORD cbData = 8192;
DWORD dwRet;
Loại DWORD = 0;
wchar_t PerfData[ 2048 ] = { 0 };
bộ nhớ(PerfData, 0, wcslen(PerfData));
dwRet = RegQueryValueEx(hKey,
achValue,
NULL,
&kiểu,
(LPBYTE)Dữ liệu hoàn hảo,
&cbDữ liệu
);
if (dwRet == ERROR_SUCCESS);//không làm gì cả
else printf( "\n\nRegQueryValueEx Thất bại!" );
_tprintf( TEXT( "\n #%.3d - [ %-30s ]" ), i + 1, achValue );
RegDeleteValue(hKey, achValue);
}//nếu như
}//vì
}//Đọc giá trị
Nó hoạt động tốt nên tôi nghĩ, tôi chỉ cần đặt RegDeleteValue vào đó và mọi giá trị sẽ bị xóa. Thật không may, đó không phải là những gì đang xảy ra. API này sẽ chỉ xóa 2-3 giá trị rồi trả về. Mình chạy lại thì nó lại xóa 2-3 giá trị rồi quay lại mà không biết tại sao? ? ? ? Về mặt lý thuyết, nếu tôi tìm thấy một thung lũng, tôi có thể xóa nó đi, vì vậy tôi không hiểu tại sao điều này lại xảy ra.
Ai đó có thể giúp tôi sửa mã của tôi không?
Cảm ơn!
Do lỗi "xóa khỏi mảng" điển hình, chương trình của bạn chỉ xóa một vài giá trị, như trong mã giả này:
// chương trình này sẽ không loại bỏ tất cả các phần tử
for (int i = 0, n = arraySize; i < n; ++i)
mảng_remove(mảng, i);
// bước 1, i=0: 1 2 3 4 5 6
// ^ đã xóa
// bước 2, i=1: 2 3 4 5 6
// ^ đã xóa
// bước 3, i=2: 2 4 5 6
// ^ đã xóa
// bước 4, i=3: 2 4 6
// ^ RegEnumValue trả về lỗi và thoát khỏi vòng lặp
Phương pháp đúng phải như thế này:
trong khi (cValues > 0) {
/*xóa giá trị đăng ký tại chỉ mục 0 */
--cGiá trị;
}
Để nhanh chóng sửa mã của bạn, hãy thay thế tham số thứ hai của RegEnumValue() bằng 0
.
Tôi là một lập trình viên xuất sắc, rất giỏi!