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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie zu entkommen, dass die Schlitze, wie in der ersten Zeile...
Wenn Sie nicht, die
RegQueryValueEx
Funktion nicht finden kann die angegebene Taste, und es gibtERROR_FILE_NOT_FOUND
(== 2).Aber es gibt ein anderes problem. Sie sollten Deklaration der buffer-array als Typ
wchar_t
(oderTCHAR
), anstattchar
:Sonst, die
RegQueryValueEx
- Funktion gehen, um zu versuchen, um zu füllen das array mit einem Unicode-string Lesen aus dem angegebenen registry-Schlüssel, und du wirst etwas unleserlich.auto
syntax von der ursprünglichen Frage; ich nehme an, er ist nicht mit Microsoft ' s compiler. Was würden Sie vorschlagen, wie ein besserer Ansatz als WMI? Ich bin fast sicher, dass das Lesen dieser aus der registry ist nicht der richtige Weg.