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

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Alex_Privzem
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 16.05.2005 (Пн) 16:13

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

Сообщение Alex_Privzem » 16.05.2005 (Пн) 16:18

Подскажите, если кто знает, как можно получить список подветок в VB?
Придопустим HCUuser\Software\Microsoft
Как можно получить список веток которые есть в ветке Microsoft?
И еще как получить список параметров которые есть в ветке?
Заранее благодарен за помощь.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.05.2005 (Пн) 16:20

Искать пробовал?
Lasciate ogni speranza, voi ch'entrate.

Alex_Privzem
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 16.05.2005 (Пн) 16:13

Сообщение Alex_Privzem » 16.05.2005 (Пн) 16:26

Пробовал, пока результаты 0! :(

KDima
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 759
Зарегистрирован: 14.07.2004 (Ср) 23:14
Откуда: СПб

Сообщение KDima » 16.05.2005 (Пн) 16:45

А подумать? :wink:
Скачай VB Help, может поможет...
http://ln.com.ua/~openxs/articles/smart-questions-ru.html
Хороший прогер не тот, кто всё знает, хороший прогер знает, где найти знание.

Последний раз редактировалось: Administrator (15.07.2004 (Вт) 00:01), всего редактировалось 999 раз(а)

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 16.05.2005 (Пн) 18:44

Alex_Privzem
Если ты искал и не нашел, расскажи как ты искал, что писал в поисковик.
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

Alex_Privzem
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 16.05.2005 (Пн) 16:13

Сообщение Alex_Privzem » 17.05.2005 (Вт) 10:42

FAKK2 писал(а):Alex_Privzem
Если ты искал и не нашел, расскажи как ты искал, что писал в поисковик.

Искал:
РАбора с реестром VB
список веток
Список ключей
.....
Впринципе проблема больше в том что я не очень рублю в VB! :(
Я больше программировал на Delphi и PHP, а вот пришлось.....
Впринципе теже яйца только в профиль, но есть отличия в самом принципе работы с оболочкой, между VB и Delphi, ну и так мелочи разные. Потому если кто-то подкинет пример как разобраться с проблемой чтения веток..... Буду благодарен

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.05.2005 (Вт) 10:44

А, дельфист :)
Поищи файл modRegistry, в нем были вынесены все декларации.
Если найдешь модуль от GSerg'а (они от разных авторов есть в одним названием), то будет тебе счастье. Чтобы долго не искать, загляни в Проекты и Кирпичный завод.
Lasciate ogni speranza, voi ch'entrate.

Alex_Privzem
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 16.05.2005 (Пн) 16:13

Сообщение Alex_Privzem » 17.05.2005 (Вт) 16:28

Люди, хелп. С проблемой чтения веток разобрался вот таким образом:

'Open the registry key
If RegOpenKey(HKEY_CURRENT_USER, "Software\VB and VBA Program Settings\TehDoc", hKey) = 0 Then
'Create a buffer
sName = Space(BUFFER_SIZE)
'Enumerate the keys
While RegEnumKeyEx(hKey, Cnt, sName, Ret, ByVal 0&, vbNullString, ByVal 0&, ByVal 0&) <> ERROR_NO_MORE_ITEMS
'Show the enumerated key
List1.AddItem " " + Left$(sName, Ret)
'Me.Print " " + Left$(sName, Ret)
'prepare for the next key
Cnt = Cnt + 1
sName = Space(BUFFER_SIZE)
Ret = BUFFER_SIZE
Wend
'close the registry key
RegCloseKey hKey
Else
List1.AddItem " Error while calling RegOpenKey"
'Me.Print " Error while calling RegOpenKey"
End If
не помню где именно но нашел этот пример здесь в форуме.
Помогите решить проблему чтения списка параметров......
Тоесть в ветке скажем 10 параметров, мне надо получить их названия.
Может есть у кого-то примерчик. Интуитивно чувствую что это не такая уж страшная проблема но.... мозги уже просто пухнут! И сделать надо!
:(

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 17.05.2005 (Вт) 16:35

Код: Выделить всё
Public Function EnumerateValues( _
        ByRef sKeyNames() As String, _
        ByRef iKeyCount As Long _
    ) As Boolean
Dim lResult As Long
Dim hKey As Long
Dim sName As String
Dim lNameSize As Long
Dim sData As String
Dim lIndex As Long
Dim cJunk As Long
Dim cNameMax As Long
Dim ft As Currency
   
   ' Log "EnterEnumerateValues"

   iKeyCount = 0
   Erase sKeyNames()
   
   lIndex = 0
   lResult = RegOpenKeyEx(m_hClassKey, m_sSectionKey, 0, KEY_QUERY_VALUE, hKey)
   If (lResult = ERROR_SUCCESS) Then
      ' Log "OpenedKey:" & m_hClassKey & "," & m_sSectionKey
      lResult = RegQueryInfoKey(hKey, "", cJunk, 0, _
                               cJunk, cJunk, cJunk, cJunk, _
                               cNameMax, cJunk, cJunk, ft)
       Do While lResult = ERROR_SUCCESS
   
           'Set buffer space
           lNameSize = cNameMax + 1
           sName = String$(lNameSize, 0)
           If (lNameSize = 0) Then lNameSize = 1
           
           ' Log "Requesting Next Value"
         
           'Get value name:
           lResult = RegEnumValue(hKey, lIndex, sName, lNameSize, _
                                  0&, 0&, 0&, 0&)
           ' Log "RegEnumValue returned:" & lResult
           If (lResult = ERROR_SUCCESS) Then
       
                ' Although in theory you can also retrieve the actual
                ' value and type here, I found it always (ultimately) resulted in
                ' a GPF, on Win95 and NT.  Why?  Can anyone help?
       
               sName = Left$(sName, lNameSize)
               ' Log "Enumerated value:" & sName
                 
               iKeyCount = iKeyCount + 1
               ReDim Preserve sKeyNames(1 To iKeyCount) As String
               sKeyNames(iKeyCount) = sName
           End If
           lIndex = lIndex + 1
       Loop
   End If
   If (hKey <> 0) Then
      RegCloseKey hKey
   End If

   ' Log "Exit Enumerate Values"
   EnumerateValues = True
   Exit Function
   
EnumerateValuesError:
   If (hKey <> 0) Then
      RegCloseKey hKey
   End If
   Err.Raise vbObjectError + 1048 + 26003, App.EXEName & ".cRegistry", Err.Description
   Exit Function

End Function

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 17.05.2005 (Вт) 16:41

и еще один вариант с коллекцией:

Код: Выделить всё
'****************************************************************************
'       Enumerate values under a given registry key
'       Inputs: Key Root, Key Name
'       Return: a collection, where each element of the collection
'               is a 2-element array of Variants:
'               element(0) is the value name, element(1) is the value's value
'       Source: Slightly Modified from www.vb2themax.com EnumRegistryValues
'****************************************************************************
Function EnumRegistryValues(ByVal hkey As hkey, ByVal KeyName As String) As _
    Collection
    Dim handle As Long
    Dim index As Long
    Dim valueType As Long
    Dim name As String
    Dim nameLen As Long
    Dim resLong As Long
    Dim resString As String
    Dim length As Long
    Dim valueInfo(0 To 1) As Variant
    Dim RetVal As Long
    Dim i As Integer
    Dim vTemp As Variant
   
    ' initialize the result
    Set EnumRegistryValues = New Collection
   
    ' Open the key, exit if not found.
    If Len(KeyName) Then
        If RegOpenKeyEx(hkey, KeyName, 0, KEY_READ, handle) Then Exit Function
        ' in all cases, subsequent functions use hKey
        hkey = handle
    End If
   
    Do
        ' this is the max length for a key name
        nameLen = 260
        name = Space$(nameLen)
        ' prepare the receiving buffer for the value
        length = 4096
        ReDim resBinary(0 To length - 1) As Byte
       
        ' read the value's name and data
        ' exit the loop if not found
        RetVal = RegEnumValue(hkey, index, name, nameLen, ByVal 0&, valueType, _
            resBinary(0), length)
       
        ' enlarge the buffer if you need more space
        If RetVal = ERROR_MORE_DATA Then
            ReDim resBinary(0 To length - 1) As Byte
            RetVal = RegEnumValue(hkey, index, name, nameLen, ByVal 0&, _
                valueType, resBinary(0), length)
        End If
        ' exit the loop if any other error (typically, no more values)
        If RetVal Then Exit Do
       
        ' retrieve the value's name
        valueInfo(0) = Left$(name, nameLen)
       
        ' return a value corresponding to the value type
        Select Case valueType
           
            Case REG_DWORD
                CopyMemory resLong, resBinary(0), 4
                valueInfo(1) = resLong
           
            Case REG_SZ
                ' copy everything but the trailing null char
                If length <> 0 Then
                    resString = Space$(length - 1)
                    CopyMemory ByVal resString, resBinary(0), length - 1
                    valueInfo(1) = resString
                Else
                    valueInfo(1) = ""
                End If
               
            Case REG_EXPAND_SZ
                ' copy everything but the trailing null char
                ' expand the environment variable to it's value
                ' Ignore a Blank String
                If length <> 0 Then
                    resString = Space$(length - 1)
                    CopyMemory ByVal resString, resBinary(0), length - 1
                    length = ExpandEnvironmentStrings(resString, resString, Len(resString))
                    valueInfo(1) = TrimNull(resString)
                Else
                    valueInfo(1) = ""
                End If

            Case REG_BINARY
                ' shrink the buffer if necessary
                If length < UBound(resBinary) + 1 Then
                    ReDim Preserve resBinary(0 To length - 1) As Byte
                End If
                 'Convert to display as string like this: 00 01 01 00 01
                    For i = 0 To UBound(resBinary)
                         resString = resString & " " & Format(Trim(Hex(resBinary(i))), "0#")
                    Next i
                    valueInfo(1) = LTrim(resString) 'Get rid of leading space
           
            Case REG_MULTI_SZ
                ' copy everything but the 2 trailing null chars
                resString = Space$(length - 2)
                CopyMemory ByVal resString, resBinary(0), length - 2
               
                'convert from null-delimited (vbNullChar) stream of strings
                'to comma delimited stream of strings
                'The listview likes it better that way
                resString = Replace(resString, vbNullChar, ",", , , vbBinaryCompare)
                valueInfo(1) = resString
           
            Case Else
                ' Unsupported value type - do nothing
        End Select
       
        ' add the array to the result collection
        ' the element's key is the value's name
        EnumRegistryValues.Add valueInfo, valueInfo(0)
       
        index = index + 1
    Loop
   
    ' Close the key, if it was actually opened
    If handle Then RegCloseKey handle
       
End Function

Alex_Privzem
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 16.05.2005 (Пн) 16:13

Сообщение Alex_Privzem » 18.05.2005 (Ср) 16:11

Всем спасибо за помощь с данным вопросом разобрался.
Вот таким образом
Код: Выделить всё

'Константы основных веток реестра
Const HKEY_CLASSES_ROOT = &H80000000
Const HKEY_CURRENT_USER = &H80000001
Const HKEY_LOCAL_MACHINE = &H80000002
Const HKEY_USERS = &H80000003
Const HKEY_CURRENT_CONFIG = &H80000005
Const HKEY_DYN_DATA = &H80000006
Const ERROR_NO_MORE_ITEMS = 259&
Const BUFFER_SIZE As Long = 255
Dim hKey As Long, Cnt As Long, sName As String, sData As String, Ret As Long, RetData As Long

    List1.AddItem "RegEnumKeyEx"
    Ret = BUFFER_SIZE
    'Open the registry key
    If RegOpenKey(HKEY_CURRENT_USER, "Software\VB and VBA Program Settings", hKey) = 0 Then
        'Create a buffer
        sName = Space(BUFFER_SIZE)
        'Enumerate the keys
        While RegEnumKeyEx(hKey, Cnt, sName, Ret, ByVal 0&, vbNullString, ByVal 0&, ByVal 0&) <> ERROR_NO_MORE_ITEMS
            'Show the enumerated key
            List1.AddItem "  " + Left$(sName, Ret)
            'prepare for the next key
            Cnt = Cnt + 1
            sName = Space(BUFFER_SIZE)
            Ret = BUFFER_SIZE
        Wend
        'close the registry key
        RegCloseKey hKey
    Else
        List1.AddItem "  Error while calling RegOpenKey"
    End If
    List1.AddItem "RegEnumValue"
    'Me.Print vbCrLf + "RegEnumValue"
    Cnt = 0
    'Open a registry key
    If RegOpenKey(HKEY_CURRENT_USER, "Software\VB and VBA Program Settings\Test", hKey) = 0 Then
        'initialize
        sName = Space(BUFFER_SIZE)
        sData = Space(BUFFER_SIZE)
        Ret = BUFFER_SIZE
        RetData = BUFFER_SIZE
        'enumerate the values
        While RegEnumValue(hKey, Cnt, sName, Ret, 0, ByVal 0&, ByVal sData, RetData) <> ERROR_NO_MORE_ITEMS
            'show data
            If RetData > 0 Then List1.AddItem "  " + Left$(sName, Ret) + "=" + Left$(sData, RetData - 1)
            'prepare for next value
            Cnt = Cnt + 1
            sName = Space(BUFFER_SIZE)
            sData = Space(BUFFER_SIZE)
            Ret = BUFFER_SIZE
            RetData = BUFFER_SIZE
        Wend
        'Close the registry key
        RegCloseKey hKey
    Else
        List1.AddItem "  Error while calling RegOpenKey"
    End If

может комунибудь тоже пригодится.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot и гости: 160

    TopList