Sistema Operativo: Windows 7 de 32 bits
Idioma: C++¿Por qué la función RegQueryValueEx() devuelve ERROR_FILE_NOT_FOUND mientras intenta leer desde una clave de registro?
he tratado de acceder a Registro HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\Scsi\\Scsi Port 0
, Driver
clave (tipo REG_SZ
) - no hay problema.
Lo mismo para leer desde HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM
, todas las teclas (tipos REG_SZ
) tienen barras inclinadas, por ejemplo \Device\Serial0
.
Durante la lectura de dichas claves siempre devuelve 2 (No existe el fichero) con el siguiente código de ejemplo:
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 ---
¿Cuál es la forma correcta de leer valores clave con barras en llamas?
Above ha sido respondida correctamente por Cody Gray.
Debajo de otro problema.
Im que consigue el mismo problema cuando estoy usando variable en lugar de una cadena de texto.
Iv considera tanto se acerca con barras individuales y dobles:
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!
He intentado todas las variantes con "\ Device ..", "/ dispositivo", "\ Device", etc.
TEXTO ("\\ \\ Dispositivo Serial0")? –
@Werner, no, la función 'RegQueryValueEx' solo * consulta el valor de una clave de registro. Los valores son los pares nombre/datos almacenados dentro de las claves. Por lo tanto, no puede pasarle una ruta anidada de claves como describe porque los valores no tienen rutas. Es cierto que la terminología es bastante confusa, Raymond Chen intentó explicarlo [aquí] (http://blogs.msdn.com/b/oldnewthing/archive/2009/02/04/9394113.aspx). –