2016-01-19 2 views
-3

Я создал ключ, используя regedit, теперь хочу получить его значение. Он не дает никаких ошибок, но ничего не показывает. Код:Открытие ключа реестра в c

int main() { 
    HKEY hKey; 
    RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Ehsan Akbari", 0, KEY_ALL_ACCESS, &hKey); 
    TCHAR sz[50]; 
    DWORD size = 50,type; 
    RegEnumValue(hKey, 0, L"test", &size, NULL, &type, (LPBYTE)sz, &size); 
    RegCloseKey(hKey); 
    getch(); 
    return 0; 
} 

Изображение смерзаться: picture

Что я делаю не так?

Редактировать


Когда я отлажена я увидел, что hKey является NULL, но GetLastError ничего не сообщают.

+1

Вы забыли часть, в которой вы печатаете значение, которое вы получили на экране. Вы также не проверяете ошибки, что помогло бы с 'hKey' быть' NULL'. – andlabs

+0

Как вы знаете, что он не дает никаких ошибок, если вы не проверяете наличие каких-либо ошибок. Во всяком случае, ваш скриншот показывает ключ под 'HKEY_CURRENT_USER', и вы пытаетесь открыть его под' HKEY_LOCAL_MACHINE'. –

+2

Посмотрите на документы - 'RegOpenKeyEx' не сообщает об ошибках через' GetLastError() ' – MrEricSir

ответ

6

Вот непосредственные проблемы, которые я вижу:

  1. Вы не обнаруживают никаких ошибок, потому что вы не» t проверить наличие ошибок. Прочтите документацию для каждой функции. Код ошибки возвращается в возвращаемом значении.
  2. Вы запрашиваете KEY_ALL_ACCESS, который не будет предоставлен под номером HKLM. Вам необходимо запросить доступ только для чтения KEY_READ.
  3. Ваш скриншот показывает, что ключ был создан под номером HKCU, и вы пытаетесь открыть его под номером HKLM.
  4. RegEnumValue ожидает размер буфера данных в байтах. Вы передаете длину, количество символов.
  5. Вы смешиваете литералы Unicode и TCHAR. Это бессмысленно. Ваш код не будет компилировать таргетинг на MBCS, и в любом случае вам больше неинтересна Win98. Прекратите использовать TCHAR и используйте вместо этого wchar_t.
  6. Параметр lpValueName должен быть модифицируемым буфером. Вы передаете литерал. Помните, что эта функция перечисляет значения. Он не читает определенные именованные значения, как вы ожидаете.
  7. Параметр lpcchValueName содержит размер буфера, который вы передали в lpcchValue в символах. Вы передаете длину буфера данных.
  8. Возвращенные данные могут не иметь нулевого завершения. Вы должны защититься от этого, как описано в документации.
  9. Для программы C, которая игнорирует свои аргументы, правильный main - int main(void).

Я ожидаю, что ошибок будет больше, но я перестал смотреть на эту точку. Я рекомендую вам провести некоторое время с документацией.

1

Чтобы открыть путь «Ehsan Акбери» в HKEY_CURRENT_USER, вы можете попробовать это:

HKEY hKey; 
long result = RegOpenKeyEx(HKEY_CURRENT_USER , TEXT("\\Ehsan Akbari"), 0, KEY_ALL_ACCESS, &hKey); 

if (result == ERROR_SUCCESS) 
{ 
    cout << "OK" << endl; 
} 
else 
{ 
    cout << "Error " << result << endl; 
} 
+0

Посмотрите на его скриншот ... –

+0

А, я вижу, отредактирован ... –

+0

Это в моей программе, в C не C++ –