Узнать существует ли запись в реестре

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _nic, 2 Jun 2007.

  1. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Проблема моя сотоит в том что вот этот код не работает
    Code:
    #include <windows.h>
    #include <stdio.h>
    #include <conio.h>
    main()
    {
    HKEY hKey;char szProductType[32]; DWORD dwBufLen=32;
    RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_EXECUTE,&hKey);
    if(RegQueryValueEx(hKey,"test",NULL,NULL,szProductType,&dwBufLen) != ERROR_SUCCESS)
    {
    printf("no k \n");
    getch();
    }
    }
    
    RegQueryValueEx даже если есть запись с нужным именем невозращает ERROR_SUCCESS.Где я мог допустить ляп?
     
  2. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    LONG RegQueryValueEx(

    HKEY hKey, // handle of key to query
    LPTSTR lpValueName, // address of name of value to query
    LPDWORD lpReserved, // reserved
    LPDWORD lpType, // address of buffer for value type
    LPBYTE lpData, // address of data buffer
    LPDWORD lpcbData // address of data buffer size
    );

    у тебя LPDWORD lpType нулю равен
     
  3. da_ff

    da_ff Elder - Старейшина

    Joined:
    11 Jul 2006
    Messages:
    118
    Likes Received:
    22
    Reputations:
    26
    а ты проверь прежде указатель на ключ получен или нет
    замени Key_execute на Key_all_access
     
  4. inSa(Ne)rd

    inSa(Ne)rd В Стране Чудес

    Joined:
    14 Mar 2005
    Messages:
    245
    Likes Received:
    1,369
    Reputations:
    168
    и указывай Reg_sz как тип данных если читается строка
     
  5. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,118
    Reputations:
    1,139
    В Msdn примеры были вроде же. И там есть описание каждого параметра
     
  6. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Переписал вот так
    Code:
    #include <windows.h>
    #include <stdio.h>
    #include <conio.h>
    main()
    {
    HKEY hKey;char szProductType[32]; DWORD dwBufLen=32;char ktp[]="REG_SZ";
    RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_ALL_ACCESS,&hKey);
    if(RegQueryValueEx(hKey,"mt",NULL,(LPDWORD)ktp,szProductType,&dwBufLen) != ERROR_SUCCESS)
    {
    printf("no k \n");
    getch();
    }
    }
    
    Непомогло.Может кто нибудь даст ссылку на рабочий пример?
     
  7. tclover

    tclover nobody

    Joined:
    13 Dec 2005
    Messages:
    741
    Likes Received:
    682
    Reputations:
    287
    Code:
    RegQueryValueEx(hKey,"mt",NULL,(LPDWORD)ktp,(LPBYTE)szProductType,&dwBufLen)
     
    1 person likes this.
  8. Xserg

    Xserg Elder - Старейшина

    Joined:
    9 Dec 2006
    Messages:
    135
    Likes Received:
    127
    Reputations:
    53
    У меня работает
    Code:
    HKEY Key;
    char szProductType[132];
    DWORD dwBufLen=132;
    DWORD ktp =REG_SZ; // так  работает
    RegOpenKeyExA(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_ALL_ACCESS,&Key);
    if(RegQueryValueExA(Key,"kav",NULL,&ktp,(LPBYTE)szProductType,&dwBufLen) != ERROR_SUCCESS)
       {printf("no k \n");} else {printf(szProductType);}
    getch();
    return 0;
    
     
    1 person likes this.
  9. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,118
    Reputations:
    1,139
    о, да! =\

    DWORD dwValueType = REG_SZ;
    RegQueryValueExA( ... &dwValueType... )
     
  10. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    char ktp[]="REG_SZ";

    я, б*я, говорил что надо указать константу REG_SZ а не указатель на строку "REG_SZ"
    эх вы молодежь, все это от нечитания msdn.
     
    #10 KEZ, 3 Jun 2007
    Last edited by a moderator: 5 Jun 2007
    1 person likes this.
  11. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Мистика какая то в одном случае работает http://img181.imageshack.us/img181/9531/tk2qb5.jpg .В другом случае неработает хоть запись с нужным именем в разделе реестра присутствует http://img181.imageshack.us/img181/4186/tk1sz5.jpg
     
  12. Xserg

    Xserg Elder - Старейшина

    Joined:
    9 Dec 2006
    Messages:
    135
    Likes Received:
    127
    Reputations:
    53
    Никакой мистики
    Сравни мой пример и свой 132!=32
     
  13. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Действительно просто содержимое в буфере не помещалось :)
    PS:у меня возник ещё один вопрос как прочитать значение отличающиеся от REG_SZ к примеру REG_DWORD.Какими для этого должны быть pData, lpcbData.Если я делаю так (LPBYTE)&szProductType когда szProductType типа DWORD то получаю ошибку о том что нельзя преобразовать unsigned long в unsigned long* .Может кто нибудь привести заведомо рабочий пример отличный от того что на мсдн?
     
    #13 _nic, 7 Jun 2007
    Last edited: 11 Jun 2007