hệ thống: Windows 7 32bit
Ngôn ngữ: C++Tại sao hàm RegQueryValueEx() trả về ERROR_FILE_NOT_FOUND trong khi cố gắng đọc từ khóa đăng ký?
Tôi đã cố gắng để truy cập đăng ký HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\Scsi\\Scsi Port 0
, phím Driver
(loại REG_SZ
) - không có vấn đề.
Điều tương tự để đọc từ HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM
, tất cả các phím (loại REG_SZ
) có dấu gạch chéo, ví dụ: \Device\Serial0
.
Trong khi đọc các phím như vậy nó luôn luôn trả 2 (không có tập tin như vậy) với mã sau đây ví dụ:
HKEY hKey = 0;
DWORD dwType = REG_SZ;
char buf[255] = {0};
DWORD dwBufSize = sizeof(buf);
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS)
{
auto ret = RegQueryValueEx(hKey, TEXT("\Device\Serial0"), 0, &dwType, (LPBYTE)buf, &dwBufSize);
// ret always == 2 for key with slashes
--- CUT ---
cách thích hợp để đọc các giá trị quan trọng với dấu gạch chéo tên là gì?
Ở trên đã được Cody Gray trả lời đúng.
Bên dưới một vấn đề khác.
Tôi gặp vấn đề tương tự khi sử dụng biến thay vì chuỗi văn bản.
Iv coi cả hai phương pháp tiếp cận với đơn và đôi slashes:
HKEY hKey = 0;
DWORD keyType = REG_SZ;
TCHAR buf[255] = {0};
DWORD bufSize = sizeof(buf);
QSettings winReg("HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM", QSettings::NativeFormat);
auto comsKey = winReg.allKeys();
FOREACH(auto com, comsKey)
{
// FOREACH - boost macro
// comsKey = QList<QString> (list of key names) [from Qt framework]
// com = QString (single key name) [from Qt framework]
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS)
{
wchar_t* keyw = new wchar_t();
//com.replace("/", "\\\\"); <- checked both variants commented and not commented; com == /Device/Serial0 so im converting to \\Device\\Serial0
int size = com.size();
mbstowcs(keyw, com.toStdString().data(), size);
//auto ret = RegQueryValueEx(hKey, TEXT("\\Device\\Serial0"), 0, &keyType, (LPBYTE)buf, &bufSize); // <- this works!
auto ret = RegQueryValueExW(hKey, (LPCWSTR)&keyw, 0, &keyType, (LPBYTE)buf, &bufSize); // <- this one not works!
Tôi đã thử tất cả các biến thể với "\ Device ..", "/ Device", "\ Device", vv
TEXT ("\\ \\ Device Serial0")? –
@Werner, không, chức năng 'RegQueryValueEx' * chỉ * truy vấn giá trị của khóa đăng ký. Giá trị là các cặp tên/dữ liệu được lưu trữ trong các khóa. Vì vậy, bạn không thể vượt qua nó một đường dẫn lồng nhau của các phím như bạn mô tả bởi vì các giá trị không có đường dẫn. Phải thừa nhận rằng, thuật ngữ khá khó hiểu, Raymond Chen đã cố gắng giải thích nó [ở đây] (http://blogs.msdn.com/b/oldnewthing/archive/2009/02/04/9394113.aspx). –