Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как записать в реестр DWORD / 6 сообщений из 6, страница 1 из 1
31.05.2011, 04:11
    #37286520
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как записать в реестр DWORD
Глянул сюда:
/topic/217327&hl=regsetdword
Код: plaintext
\'ФУНКЦИЯ ДЛЯ ЗАПИСИ ПАРАМЕТРА ТИПА DWORD\nPublic Sub RegSetDWORD(Root As Long, SubKey As String, strValueName As String, ByVal Value As Long)\nDim lResult As Long, keyhand As Long\nCall RegCreateKey(Root, SubKey, keyhand)\nlResult = RegSetValueEx(keyhand, strValueName,  0 &,  4 , Value,  4 )\nCall RegCloseKey(keyhand)\nEnd Sub
Не понравилось, + RegCreateKey (без Ex) приводит к crash.
Переписал на свой лад:
Код: plaintext
Public Function SetRegDWORD(hKey As Long, lpszSubKey As String, _\n                    sSetValue As String, _\n                    ByVal sValue As Long, reg64 As Boolean) As Boolean\n\n    On Error GoTo ErrorRoutineErr:\n\n    Dim phkResult As Long\n    Dim lResult As Long\n    Dim SA As SECURITY_ATTRIBUTES\n    Dim Create As Long\n\n    \'Note: This function will create the key or\n    \'value if it doesn\'t exist.\n    \'Open or Create the key\n    If reg64 Then\n        RegCreateKeyEx hKey, lpszSubKey,  0 , "", _\n            REG_OPTION_NON_VOLATILE, _\n             KEY_ALL_ACCESS Or KEY_WOW64_64KEY, SA, phkResult, Create\n    Else\n        RegCreateKeyEx hKey, lpszSubKey,  0 , "", _\n            REG_OPTION_NON_VOLATILE, _\n            KEY_ALL_ACCESS, SA, phkResult, Create\n    End If\n    lResult = RegSetValueEx(phkResult, sSetValue,  0 &, _\n        REG_DWORD, sValue, _\n         4 )\n\n    \'Close the key\n    RegCloseKey phkResult\n\n    \'Return SetRegValue Result\n    SetRegDWORD = (lResult = ERROR_SUCCESS)\n    Exit Function\n\nErrorRoutineErr::\n  SetRegDWORD = False\n\nEnd Function

Задача собственно "примитив". (не тут та было)
1) Если есть параметр --blablabla, то надо в реестре создать "blablabla" REG_DWORD 0x00000001 (1)
2) Если нет параметра --blablabla, то надо удалить из реестра "blablabla" (ежли есть)

Делаю так
Код: plaintext
        SetRegDWORD HKEY_CURRENT_USER, "SOFTWARE\\...\\Parameters", _\n          "blablabla",  1 , False
Вместо 1 рисует 0х00000031 (49)

Делаю так
Код: plaintext
        SetRegDWORD HKEY_CURRENT_USER, "SOFTWARE\\...\\Parameters", _\n          "blablabla",  0 , False
Вместо 0 рисует 0х00000030 (48)

Ну и где проблема?

P.S. Читаю без проблем. Ну по крайне мере ф-ция ниже умеет превратить REG_DWORD=1 в true а REG_DWORD=0 (или отсутствует) в false -а больше мне ничего и не нужно.

Код: plaintext
Function GetDword(hKey As Long, ByVal lpszSubKey As String, ByVal strValue As String) As Long\n    Dim dwData As Long\n    Dim phkResult As Long\n    Dim rtn As Long\n    GetDword =  0 \n    rtn = RegOpenKeyEx(hKey, lpszSubKey,  0 &, KEY_READ, phkResult)\n    If rtn <>  0 & Then Exit Function\n    rtn = RegQueryValueExBin(phkResult, strValue,  0 &, REG_DWORD, dwData,  4 &)\n    If rtn <>  0 & Then Exit Function\n    rtn = RegCloseKey(phkResult)\n    GetDword = dwData\nEnd Function

===================
Ну, сюда же вопрос, как удалить параметр реестра REG_DWORD/REG_SZ итп. (если есть) без ругани (если нет). Думаю найду быстро, но от прямого ответа не откажусь.
...
Рейтинг: 0 / 0
31.05.2011, 08:17
    #37286562
скукотища
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как записать в реестр DWORD
Дмитрий77,
полной уверенности нет, но проблема в размере (типе) параметров в объявлении функции RegSetValueEx.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
'LONG WINAPI RegSetValueEx(
'  __in        HKEY hKey,
'  __in_opt    LPCTSTR lpValueName,
'  __reserved  DWORD Reserved,
'  __in        DWORD dwType,
'  __in_opt    const BYTE *lpData,
'  __in        DWORD cbData
');

declare function RegSetValueEx& ...
    ByVal hKey as Long, _
    ByVal lpValueName as String, _
    ByVal Reserved as Integer, _
    ByVal dwType as Integer, _
    ByVal lpData as Long, _
    ByVal cbData as Integer)
...
Рейтинг: 0 / 0
31.05.2011, 11:32
    #37286836
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как записать в реестр DWORD
Дмитрий77,
стандартное описание ANSI-версии:
Код: plaintext
1.
2.
3.
'Note that if you declare the lpData parameter as String, you must pass it By Value.
Public Declare Function RegSetValueEx Lib "advapi32" Alias "RegSetValueExA" ( _
   ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, _
   ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
Использование для записи DWORD (dwValue As Long):
Код: plaintext
RegSetValueEx(..., dwValue,  4 )
В теме по ссылке lpData описан как String.
Можно описать специализированно:
Код: plaintext
1.
2.
Public Declare Function RegSetDWORDValueEx Lib "advapi32" Alias "RegSetValueExA" ( _
   ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, _
   ByVal dwType As Long, dwData As Long, Optional ByVal cbData As Long =  4 ) As Long

По сплиттеру отпишусь позднее.

скукотища,
Integer в VB 2-хбайтный.
...
Рейтинг: 0 / 0
31.05.2011, 12:08
    #37286933
скукотища
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как записать в реестр DWORD
Бенедиктскукотища,
Integer в VB 2-хбайтный. Был неправ. Исправлюсь. Спасибо за напоминание.
...
Рейтинг: 0 / 0
31.05.2011, 17:18
    #37287874
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как записать в реестр DWORD
Бенедикт, спасибо.
Действительно, у меня был ByVal szData As String.
>Вместо 1 рисует 0х00000031 (49)
>Вместо 0 рисует 0х00000030 (48)
Этож chr(48)->0 chr(49)-> 1 мог бы сам смекнуть.
....вот так пользуешься годами чьими-то недоделанными Public Function, а чуть надо что поменять, оно и ругается.

Так все работает:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
Declare Function RegSetDWORDValueEx Lib "advapi32" Alias "RegSetValueExA" ( _
   ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, _
   ByVal dwType As Long, dwData As Long, Optional ByVal cbData As Long =  4 ) As Long

Public Function SetRegDWORD(hKey As Long, lpszSubKey As String, _
                    sSetValue As String, _
                    ByVal dwValue As Long, reg64 As Boolean) As Boolean

    On Error GoTo ErrorRoutineErr:

    Dim phkResult As Long
    Dim lResult As Long
    Dim SA As SECURITY_ATTRIBUTES
    Dim Create As Long

    'Note: This function will create the key or
    'value if it doesn't exist.
    'Open or Create the key
    If reg64 Then
        RegCreateKeyEx hKey, lpszSubKey,  0 , "", _
            REG_OPTION_NON_VOLATILE, _
             KEY_ALL_ACCESS Or KEY_WOW64_64KEY, SA, phkResult, Create
    Else
        RegCreateKeyEx hKey, lpszSubKey,  0 , "", _
            REG_OPTION_NON_VOLATILE, _
            KEY_ALL_ACCESS, SA, phkResult, Create
    End If
    lResult = RegSetDWORDValueEx(phkResult, sSetValue,  0 &, _
        REG_DWORD, dwValue, _
         4 )

    'Close the key
    RegCloseKey phkResult

    'Return SetRegValue Result
    SetRegDWORD = (lResult = ERROR_SUCCESS)
    Exit Function

ErrorRoutineErr::
  SetRegDWORD = False

End Function

====================
БенедиктПо сплиттеру отпишусь позднее.
Спасибо что помните. Более интересен не до конца решенный вопрос с halftone (не по умолчанию), вы даже не прокомментировали. Хотя...там такие дебри, что не удивлюсь что и Вам нечего сказать.
=====================
А как грамотно удалить параметр (без ругани если его нет) - пока не смотрел.
1) Если есть параметр --blablabla, то надо в реестре создать "blablabla" REG_DWORD 0x00000001 (1)
2) Если нет параметра --blablabla, то надо удалить из реестра "blablabla" (ежли есть)
...
Рейтинг: 0 / 0
31.05.2011, 20:58
    #37288198
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как записать в реестр DWORD
Дмитрий77А как грамотно удалить параметр (без ругани если его нет) - пока не смотрел.
...
2) Если нет параметра --blablabla, то надо удалить из реестра "blablabla" (ежли есть)
Вопрос снят. Есть у меня давно уже эта ф-ция в лучшем виде.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
'------------------------------------------------------------
'Delete Value
'------------------------------------------------------------
Public Function DeleteRegValue(hKey As Long, lpszSubKey As String, sValueName As String, reg64 As Boolean) As Boolean

    On Error GoTo ErrorRoutineErr:
    
    Dim phkResult As Long
    Dim lResult As Long
    Dim SA As SECURITY_ATTRIBUTES
    Dim Create As Long
    'Open or Create the key
    If reg64 Then
        RegCreateKeyEx hKey, lpszSubKey,  0 , "", _
            REG_OPTION_NON_VOLATILE, _
             KEY_ALL_ACCESS Or KEY_WOW64_64KEY, SA, phkResult, Create
    Else
        RegCreateKeyEx hKey, lpszSubKey,  0 , "", _
            REG_OPTION_NON_VOLATILE, _
            KEY_ALL_ACCESS, SA, phkResult, Create
    End If
    lResult = RegDeleteValue(phkResult, sValueName)
    RegCloseKey (phkResult)
    'Return obtained value
    If lResult = ERROR_SUCCESS Then
        DeleteRegValue = True
    Else
        DeleteRegValue = False
    End If
    Exit Function
ErrorRoutineErr::
    DeleteRegValue = False
End Function
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как записать в реестр DWORD / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]