Warum hat die RegQueryValueEx () - Funktion zurückgeben ERROR_FILE_NOT_FOUND, während Sie versuchen, zu Lesen von einem registry-key?

System: Windows 7 32bit

Sprache: C++

Habe ich versucht, Zugriff auf register HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\Scsi\\Scsi Port 0 key Driver (Typ REG_SZ) -- kein problem.

Der gleiche für das Lesen von HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM alle Schlüssel (Typen REG_SZ) bekam Schrägstriche, zum Beispiel \Device\Serial0.

Beim Lesen solcher Schlüssel es gibt immer 2 (keine solche Datei) mit folgenden Beispiel-code:

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 ---

Was ist der richtige Weg, um die read-Taste Werte mit Schrägstrichen im Namen?


Oben wurde richtig beantwortet Cody Grau.


Unter einem anderen Thema.


Im immer das gleiche problem, wenn ich mit Variablen anstelle von einem text-string.

Iv als beide Ansätze mit Einzel-und Doppel-Schrägstriche:

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!

Ich habe versucht, alle Varianten mit "\Device..", "/"Gerät", "\Device", etc.

  • TEXT("\\Device\\Serial0") ?
  • Nein, die RegQueryValueEx Funktion nur Abfragen, die den Wert eines registry-Schlüssels. Werte sind die Namen/Daten-Paare gespeichert, die innerhalb Schlüssel. So können Sie nicht übergeben Sie es einer verschachtelten Pfad der keys, wie Sie es beschreiben, da die Werte nicht über Pfade. Zugegeben, die Terminologie ist ziemlich verwirrend, Raymond Chen versucht, es zu erklären, hier.
  • RegGetValue(), auf der anderen Seite, kann die Abfrage einen Wert aus einer verschachtelten Unterschlüssel.
InformationsquelleAutor killdaclick | 2011-12-21
Schreibe einen Kommentar