работа с реестром

Тема в разделе "WASM.BEGINNERS", создана пользователем vg, 14 май 2007.

  1. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Нужно получить C:\Program Files\Example из строкового параметра в реестре.
    Есть код

    invoke RegOpenKeyEx,HKEY_CURRENT_USER,ADDR Key,0,KEY_QUERY_VALUE,ADDR hKey
    invoke RegQueryInfoKey,hKey,0,0,0,0,0,0,0,0,ADDR SizeKey,0,0
    invoke RegQueryValueEx,hKey,addr Parametr,0,0,addr ValueKey,ADDR SizeKey
    invoke MessageBox,0,addr ValueKey,0,MB_OK
    invoke RegCloseKey,hKey

    Но MessageBox показывает C:\P. В чём может быть ошибка?
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    а ValueKey какого размеру? Ты там ниче не затираешь? Я бы в даном случае посоветовал заменить вторую строчку на mov SizeKey,SizeOf ValueKey. Хотя почему не работает твой вариант не знаю. И вообще, посмтори в отладчике, что куда записывает и какая функция что возвращает.
     
  3. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Чтобы определить длину параметра, можно два раза подряд вызвать RegQueryValueEx, первый вызов заполнит переменную dwDataLen значением длины параметра, второй вызов уже имея значение длины, заполнит буфер строкой.

    Код (Text):
    1. ;=возвращает 0 если ошибка, или длину строкового параметра если успешно
    2. RegGetStringValue proc  hKey:DWORD,lpSubKey:DWORD,lpValueName:DWORD,lpOutput:DWORD
    3.     LOCAL dwDataLen         :DWORD
    4.     local hHandleKey        :DWORD
    5.     local dwType             :DWORD
    6.    
    7.     invoke  RegOpenKeyEx,hKey,lpSubKey,NULL,KEY_QUERY_VALUE,addr hHandleKey
    8.     .if eax==ERROR_SUCCESS
    9.         invoke  RegQueryValueEx, hHandleKey, lpValueName, NULL, addr dwType, NULL, addr dwDataLen
    10.         .if eax==ERROR_SUCCESS
    11.             invoke  RegQueryValueEx, hHandleKey, lpValueName, NULL, addr dwType, lpOutput, addr dwDataLen
    12.             .if eax==ERROR_SUCCESS
    13.                 invoke  RegCloseKey,hHandleKey
    14.                 dec     dwDataLen
    15.                 .if dwType==REG_MULTI_SZ
    16.                     dec     dwDataLen
    17.                 .endif
    18.                 mov     eax,dwDataLen
    19.                 ret
    20.             .endif    
    21.         .endif
    22.      .endif  
    23.      invoke  RegCloseKey,hHandleKey
    24.      xor     eax,eax
    25.      ret
    26.    
    27. RegGetStringValue endp
     
  4. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Теперь работает. СПАСИБО.