cuốn sách gpt4 ai đã làm

c - Làm cách nào để xóa sổ đăng ký 64-bit trong XP?

In lại Tác giả: Hồ Xil Thời gian cập nhật: 2023-11-01 11:37:32 27 4
mua khóa gpt4 Nike

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!

câu trả lời hay nhất

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.

Giới thiệu về c - Làm cách nào để xóa sổ đăng ký 64 bit trong XP? , chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/7598797/

27 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress