Новости
Карта сайта
Авторы
Поиск
Рассылки
Статьи и информация
VB хитрости
Популярные ошибки
Книги
Конференция
Программы
Контролы
Примеры
Разное
Ссылки

Хитрости

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

Количество просмотров: 23367

Если у вас есть хитрости, которыми хочется поделиться с товарищами по ремеслу - пишите, они обязательно будут опубликованы.

Кусочки VB-исходничков для манипуляций с системным реестром Windows
 
Автор: Gregory

Некоторые записи в реестре Win98, которые могут помочь в достижении корыстных программистских целей... Именно программистских, так как "в ручную" пользователь может почти все это без проблем и так проделать... ...почти каждый... ;)
Ничего не гарантирую, но все это опробовано и до сих пор работало...
Чуть не забыл... К сожалению функции VisualBasic'a для работы с реестром (GetSetting, SaveSetting, DeleteSetting, GetAllSettings,....) распространяются только на раздел реестра: "HKEY_CURRENT_USER\Software\VB and VBA Programm Settings" и никак не затрагивают системные, то есть, наиболее интересные области реестра...
Текст модуля с используемыми функциями для работы с реестром приведен в конце файла....
 

Как узнать сетевое имя компьютера (программно)?


Раздел: [HKEY_LOCAL_MACHINE\System\CurrentControlSet\ComputerName\ComputerName]
Параметр: ComputerName
VB Код:
 
Public Function GetMyName() As String
        GetMyNAME = GetKeyValue(HKEY_LOCAL_MACHINE, _
        "System\CurrentControlSet\Control\ComputerName\ComputerName\", _
        "ComputerName")
End Function

 

Как сделать, чтобы моя "крутейшая" программа подвешивалась
на файлы с определенным расширением в качестве программы
по умолчанию (то есть DoubleClick в проводнике чтоб запускал
ее с именем файла на котором был клик)?


1. "Крутейшая" программа должна обрабатывать командную строку,
а именно брать оттуда путь и имя этого файла...
2. Смотрим, а не висит ли уже кто-либо на этом типе файлов....
Раздел [HKEY_CLASSES_ROOT\.ext], параметр [по умолчанию]
Пример: tmpStr = GetKeyValue(HKEY_CLASSES_ROOT, FileExt, "")
(Здесь FileExt - строковая константа, см. полный пример...)
Если никого нет, то tmpStr будет равно "".
3. Если никого нет, то создаем свой раздел DefaultReg, если кто-то уже
прицепился, то добавляем в его раздел (то есть в tmpStr).
Далее смотри код примера... Я даже комментариев понаписал...
(сколько смог...)
Полный пример (VB Код):
'Комментарии излишни по-моему...
Private FullPathAndFileName As String
Private CmdLine As String

'Определяет делать ли вообще то о чем идет речь...
Private Const UpdReg As Boolean = True

'Определяет ставить наше действие "по умолчанию" или нет...
Private Const UpdDefault As Boolean = True

'Расширение на которое подвешиваем свою программу...
Private Const FileExt As String = ".rom"

'Имя своего раздела в реестре если на этом типе файлов еще никто не висит...
'(само имя ни на что не влияет)
Private Const DefaultReg As String = "ROMfile"

'Действие, которое будем делать над файлом
Private Const DefaultAct As String = "Convert"

'Название действия, которое будем делать над файлом
'(Проводник именно эту надпись выведет по правой кнопке)
Private Const DefaultActName As String = "Преобразовать"

'Описание файлов с таким расширением...
Private Const ExtDescription As String = "Asm Output file"


'Я это ставлю на Form_Load....
Private Sub Form_Load()
Dim tmpStr As String

        'Определяем свой путь и имя файла
        FullPathAndFileName = App.Path
        If Right(App.Path,1) <> "\" Then FullPathAndFileName = FullPathAndFileName & "\"
        FullPathAndFileName = FullPathAndFileName & App.EXEName & ".exe %1"
    
    
If UpdReg Then'А надо ли в реестр-то писать? [const]
    
    'Считываем на предмет "висит" ли кто на этом типе файлов...
    tmpStr = GetKeyValue(HKEY_CLASSES_ROOT, FileExt, "")

    If tmpStr = "" Then'Если никто не висит...
        tmpStr = DefaultReg
'Делаем свою запись на это расширение
        UpdateKey HKEY_CLASSES_ROOT, FileExt, "", tmpStr
'Присобачиваем свое описание таких файлов...
        UpdateKey HKEY_CLASSES_ROOT, tmpStr, "", ExtDescription
    End If

    If UpdDefault Then
'Ставим свое действие "по умолчанию"
UpdateKey HKEY_CLASSES_ROOT, tmpStr & "\shell", "", DefaultAct
    End If

    'Прописываем название действия
    UpdateKey HKEY_CLASSES_ROOT, tmpStr & "\shell\" & DefaultAct, "", DefaultActName
    'Прописываем пути и имя нашей программы....
    UpdateKey HKEY_CLASSES_ROOT, tmpStr & "\shell\" & DefaultAct & "\command", "", FullPathAndFileName

End If

    'И пошла командная строка...
    CmdLine = Command
    CmdLine = Trim(CmdLine)

Как сделать так, чтобы моя программа загружалась при старте Windows?


Раздел: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run или
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices или
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServices
Если однократно надо запустить, то вместо Run в конце RunOnce,
a вместо RunServices - RunServicesOnce
Параметр: Имя программы
Значение: Путь и имя своей программы
VB код:
        FullPathAndFileName = App.Path
        If Right(App.Path,1) <> "\" Then FullPathAndFileName = FullPathAndFileName & "\"
        FullPathAndFileName = FullPathAndFileName & App.EXEName

        'Прописываем себя в реестр (FullPathAndFileName As String)
        UpdateKey HKEY_LOCAL_MACHINE, _
        "Software\Microsoft\windows\CurrentVersion\Run", _
        App.Title, FullPathAndFileName

Мелкие гадости с параметрами mouse и keyboard


[HKEY_CURRENT_USER\Control Panel\Mouse\]
[HKEY_CURRENT_USER\Control Panel\Keyboard\]
тескт модуля с функциями работы с реестром (сперто из какого-то plug-in'a или add-in'a.... не помню уже). Сами функции не шибко хороши (например, не позволяют записать числовые параметры), но свои писать лень, так что...
Attribute VB_Name = "basReg"
Option Explicit

' This module reads and writes registry keys.  Unlike the
' internal registry access methods of VB, it can read and
' write any registry keys with string values.

'---------------------------------------------------------------
'-Registry API Declarations...
'---------------------------------------------------------------
Private Declare Function RegCloseKey Lib "advapi32" (ByVal hKey As Long) As Long
Private Declare Function RegCreateKeyEx Lib "advapi32" Alias "RegCreateKeyExA" _
(ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, _
ByVal lpClass As String, ByVal dwOptions As Long, ByVal samDesired As Long, _
ByRef lpSecurityAttributes As SECURITY_ATTRIBUTES, ByRef phkResult As Long, _
ByRef lpdwDisposition As Long) As Long
Private Declare Function RegOpenKeyEx Lib "advapi32" Alias "RegOpenKeyExA" _
(ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, _
ByVal samDesired As Long, ByRef phkResult As Long) As Long
Private Declare Function RegQueryValueEx Lib "advapi32" Alias "RegQueryValueExA" _
(ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, _
ByRef lpType As Long, ByVal lpData As String, ByRef lpcbData As Long) As Long
Private Declare Function RegSetValueEx Lib "advapi32" Alias "RegSetValueExA" _
(ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, _
ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long


'---------------------------------------------------------------
'- Registry Api Constants...
'---------------------------------------------------------------
' Reg Data Types...
Const REG_SZ = 1                         ' Unicode nul terminated string
Const REG_EXPAND_SZ = 2                  ' Unicode nul terminated string
Const REG_DWORD = 4                      ' 32-bit number

' Reg Create Type Values...
Const REG_OPTION_NON_VOLATILE = 0       ' Key is preserved when system is rebooted

' Reg Key Security Options...
Const READ_CONTROL = &H20000
Const KEY_QUERY_VALUE = &H1
Const KEY_SET_VALUE = &H2
Const KEY_CREATE_SUB_KEY = &H4
Const KEY_ENUMERATE_SUB_KEYS = &H8
Const KEY_NOTIFY = &H10
Const KEY_CREATE_LINK = &H20
Const KEY_READ = KEY_QUERY_VALUE + KEY_ENUMERATE_SUB_KEYS + KEY_NOTIFY + READ_CONTROL
Const KEY_WRITE = KEY_SET_VALUE + KEY_CREATE_SUB_KEY + READ_CONTROL
Const KEY_EXECUTE = KEY_READ
Const KEY_ALL_ACCESS = KEY_QUERY_VALUE + KEY_SET_VALUE + _
                       KEY_CREATE_SUB_KEY + KEY_ENUMERATE_SUB_KEYS + _
                       KEY_NOTIFY + KEY_CREATE_LINK + READ_CONTROL
                     
' Reg Key ROOT Types...
Public Const HKEY_CLASSES_ROOT = &H80000000
Public Const HKEY_CURRENT_USER = &H80000001
Public Const HKEY_LOCAL_MACHINE = &H80000002
Public Const HKEY_USERS = &H80000003
Public Const HKEY_PERFORMANCE_DATA = &H80000004

' Return Value...
Const ERROR_NONE = 0
Const ERROR_BADKEY = 2
Const ERROR_ACCESS_DENIED = 8
Const ERROR_SUCCESS = 0

'---------------------------------------------------------------
'- Registry Security Attributes TYPE...
'---------------------------------------------------------------
Private Type SECURITY_ATTRIBUTES
    nLength As Long
    lpSecurityDescriptor As Long
    bInheritHandle As Boolean
End Type

' The resource string will be loaded into a control's property as follows:
' Object      Property
' Form        Caption
' Menu        Caption
' TabStrip    Caption, ToolTipText
' Toolbar     ToolTipText
' ListView    ColumnHeader.Text

Sub LoadResStrings(frm As Form)
  On Error Resume Next
  
  Dim ctl As Control
  Dim obj As Object
  
  'set the form's caption
  If IsNumeric(frm.Tag) Then
    frm.Caption = LoadResString(CInt(frm.Tag))
  End If
  
  'set the controls' captions using the caption
  'property for menu items and the Tag property
  'for all other controls
  For Each ctl In frm.Controls
    Err.Clear
    If TypeName(ctl) = "Menu" Then
      If IsNumeric(ctl.Caption) Then
        If Err = 0 Then
          ctl.Caption = LoadResString(CInt(ctl.Caption))
        End If
      End If
    ElseIf TypeName(ctl) = "TabStrip" Then
      For Each obj In ctl.Tabs
        Err.Clear
        If IsNumeric(obj.Tag) Then
          obj.Caption = LoadResString(CInt(obj.Tag))
        End If
        'check for a tooltip
        If IsNumeric(obj.ToolTipText) Then
          If Err = 0 Then
            obj.ToolTipText = LoadResString(CInt(obj.ToolTipText))
          End If
        End If
      Next
    ElseIf TypeName(ctl) = "Toolbar" Then
      For Each obj In ctl.Buttons
        Err.Clear
        If IsNumeric(obj.Tag) Then
          obj.ToolTipText = LoadResString(CInt(obj.Tag))
        End If
      Next
    ElseIf TypeName(ctl) = "ListView" Then
      For Each obj In ctl.ColumnHeaders
        Err.Clear
        If IsNumeric(obj.Tag) Then
          obj.Text = LoadResString(CInt(obj.Tag))
        End If
      Next
    Else
      If IsNumeric(ctl.Tag) Then
        If Err = 0 Then
          ctl.Caption = LoadResString(CInt(ctl.Tag))
        End If
      End If
      'check for a tooltip
      If IsNumeric(ctl.ToolTipText) Then
        If Err = 0 Then
          ctl.ToolTipText = LoadResString(CInt(ctl.ToolTipText))
        End If
      End If
    End If
  Next

End Sub

'-------------------------------------------------------------------
'sample usage - 
'Debug.Print UpodateKey(HKEY_CLASSES_ROOT, "keyname", "newvalue")
'-------------------------------------------------------------------
Public Function UpdateKey(KeyRoot As Long, KeyName As String, SubKeyName _
 As String, SubKeyValue As String) As Boolean
    Dim rc As Long                      ' Return Code
    Dim hKey As Long                    ' Handle To A Registry Key
    Dim hDepth As Long                  '
    Dim lpAttr As SECURITY_ATTRIBUTES   ' Registry Security Type
    lpAttr.nLength = 50                 ' Set Security Attributes To Defaults...
    lpAttr.lpSecurityDescriptor = 0     ' ...
    lpAttr.bInheritHandle = True        ' ...

    '------------------------------------------------------------
    '- Create/Open Registry Key...
    '------------------------------------------------------------
    rc = RegCreateKeyEx(KeyRoot, KeyName, _
              0, REG_SZ, _
              REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, lpAttr, _
              hKey, hDepth)                   ' Create/Open //KeyRoot//KeyName
    
    If (rc <> ERROR_SUCCESS) Then GoTo CreateKeyError   ' Handle Errors...
    
    '------------------------------------------------------------
    '- Create/Modify Key Value...
    '------------------------------------------------------------
    If (SubKeyValue = "") Then SubKeyValue = " "        ' A Space Is Needed For 
    'RegSetValueEx() To Work...
    
    ' Create/Modify Key Value
    rc = RegSetValueEx(hKey, SubKeyName, _
                       0, REG_SZ, _
                       SubKeyValue, LenB(StrConv(SubKeyValue, vbFromUnicode)))
                       
    If (rc <> ERROR_SUCCESS) Then GoTo CreateKeyError   ' Handle Error
    '------------------------------------------------------------
    '- Close Registry Key...
    '------------------------------------------------------------
    rc = RegCloseKey(hKey)                              ' Close Key
    
    UpdateKey = True                                    ' Return Success
    Exit Function                                       ' Exit
CreateKeyError:
    UpdateKey = False                                   ' Set Error Return Code
    rc = RegCloseKey(hKey)                              ' Attempt To Close Key
End Function

'----------------------------------------------------------
'sample usage - Debug.Print GetKeyValue(HKEY_CLASSES_ROOT, 
'"COMCTL.ListviewCtrl.1\CLSID", "")
'----------------------------------------------------------
Public Function GetKeyValue(KeyRoot As Long, KeyName As String, _
SubKeyRef As String) As String
    Dim i As Long                    ' Loop Counter
    Dim rc As Long                   ' Return Code
    Dim hKey As Long                 ' Handle To An Open Registry Key
    Dim hDepth As Long               '
    Dim sKeyVal As String
    Dim lKeyValType As Long          ' Data Type Of A Registry Key
    Dim tmpVal As String             ' Tempory Storage For A Registry Key Value
    Dim KeyValSize As Long           ' Size Of Registry Key Variable
    
    ' Open RegKey Under KeyRoot {HKEY_LOCAL_MACHINE...}
    '------------------------------------------------------------
    rc = RegOpenKeyEx(KeyRoot, KeyName, 0, KEY_ALL_ACCESS, hKey) ' Open Registry Key
    
    If (rc <> ERROR_SUCCESS) Then GoTo GetKeyError          ' Handle Error...
    
    tmpVal = String$(1024, 0)                             ' Allocate Variable Space
    KeyValSize = 1024                                       ' Mark Variable Size
    
    '------------------------------------------------------------
    ' Retrieve Registry Key Value...
    '------------------------------------------------------------
    rc = RegQueryValueEx(hKey, SubKeyRef, 0, _
                         lKeyValType, tmpVal, KeyValSize)    ' Get/Create Key Value
                        
    If (rc <> ERROR_SUCCESS) Then GoTo GetKeyError          ' Handle Errors
      
    tmpVal = Left$(tmpVal, InStr(tmpVal, Chr(0)) - 1)

    '------------------------------------------------------------
    ' Determine Key Value Type For Conversion...
    '------------------------------------------------------------
    Select Case lKeyValType                     ' Search Data Types...
    Case REG_SZ, REG_EXPAND_SZ                  ' String Registry Key Data Type
        sKeyVal = tmpVal                        ' Copy String Value
    Case REG_DWORD                              ' Double Word Registry Key Data Type
        For i = Len(tmpVal) To 1 Step -1        ' Convert Each Bit
            ' Build Value Char. By Char.
            sKeyVal = sKeyVal + Hex(Asc(Mid(tmpVal, i, 1)))   
        Next
        sKeyVal = Format$("&h" + sKeyVal)        ' Convert Double Word To String
    End Select
    
    GetKeyValue = sKeyVal                                   ' Return Value
    rc = RegCloseKey(hKey)                                  ' Close Registry Key
    Exit Function                                           ' Exit
    
GetKeyError:    ' Cleanup After An Error Has Occured...
    GetKeyValue = vbNullString                   ' Set Return Val To Empty String
    rc = RegCloseKey(hKey)                       ' Close Registry Key
End Function

'--- End of Registry Processing Functions ---

Добавлено: 24 августа 2002



К хитростям

Rambler's Top100
Хостинг от Parking.ru