чтение реестра Windows

Используя этот фрагмент кода:

TCHAR buf[255] = {0};
DWORD dwBufSize = sizeof(buf);
HKEY hKey = 0;
DWORD dwType = REG_DWORD;

if ( RegOpenKeyEx( HKEY_CURRENT_USER, TEXT("Software\\Developer\\KGReader"), 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS)
{
if( RegQueryValueEx( HKEY_CURRENT_USER, TEXT("Software\\Developer\\KGReader\\ComPort"), 0, &dwType, (LPBYTE)buf, &dwBufSize ) == ERROR_SUCCESS )
{
nrPort = _wtoi(buf);

}

if( RegQueryValueEx( HKEY_CURRENT_USER, TEXT("Software\\Developer\\KGReader\\KGID"), 0, &dwType, (LPBYTE)buf, &dwBufSize ) == ERROR_SUCCESS )
{
nrCentrala = _wtoi(buf);
}

}
  1. Значение не передается hKey с помощью RegOpenKeyEx метод.
  2. Хотя RegOpenKeyEx возвращает ERROR_SUCCES, RegQueryValueEx возвращает 2 (ERROR_FILE_NOT_FOUND). KGID а также ComPort существуют, я добавил их сам, я дважды проверил пути.

0

Решение

Пройти hKey полученный из RegOpenKeyEx() позвонить в RegQueryValueEx() функции вместо HKEY_CURRENT_USER, Второй аргумент RegQueryValueEx() это имя значения, а не путь.

Например:

if( RegQueryValueEx(hKey,
TEXT("ComPort"),
0,
&dwType,
(LPBYTE)buf,
&dwBufSize ) == ERROR_SUCCESS )

Не забудьте сбросить buf а также dwBufSize до второго звонка RegQueryValueEx:

memset(buf, 0, sizeof(buf));
dwBufSize = sizeof(buf);

В целях сообщения об ошибках вы должны сохранить возвращаемое значение RegOpenKeyEx() а также RegQueryValueEx() функции, так что причина сбоя может быть известна.

Размещенный код может быть неполным, но убедитесь, что RegCloseKey(hKey) вызывается, если вызов RegOpenKeyEx() Был успешен.

4

Другие решения

Первый аргумент RegQueryValueEx должен быть HKEY открыт RegOpenKeyEx, Кроме того, второй аргумент должен быть просто именем значения, а не полным путем:

if( RegQueryValueEx( hKey, TEXT("ComPort"), 0, &dwType,
(LPBYTE)buf, &dwBufSize ) == ERROR_SUCCESS )
1