魚骨頭的雲端圖書館's Archiver

mhfo 發表於 2013-2-18 15:31

修改登入編輯 regedit

當然可以, 你可以用這些函式來看和改. 我以前無聊時有用過. 等我下班再把code刊出來



GetSystemRegistryQuota

RegConnectRegistry

RegDeleteKey

RegDeleteKeyEx

RegDeleteValue

RegDisablePredefinedCache

RegDisableReflectionKey

RegEnableReflectionKey

RegEnumKeyEx

RegEnumValue

RegFlushKey

RegGetKeySecurity

RegGetValue

RegLoadKey

RegNotifyChangeKeyValue

RegOpenCurrentUser

RegOpenKeyEx

RegOpenUserClassesRoot

RegOverridePredefKey

RegQueryInfoKey

RegQueryMultipleValues

RegQueryReflectionKey

RegQueryValueEx

RegReplaceKey

RegRestoreKey

RegSaveKey

RegSaveKeyEx

RegSetKeySecurity

RegSetValueEx

RegUnLoadKey

-----------------------------------------------------------------------------------------------------

以下的程式是用VB 6.0來改registry

這程式會先在HKEY_LOCAL_MACHINE裡新增一個"SOFTWARE\microsoft\Windows\CurrentVersion\Run\hello"的key

然後在SOFTWARE\microsoft\Windows\CurrentVersion\Run\hello裡新增一個hello的字串值, 值為"hello"

關掉registry之後會重新在HKEY_LOCAL_MACHINE打開"SOFTWARE\microsoft\Windows\CurrentVersion\Run\hello"的key.

讀取hello字串值的值之後刪除hello字串值.

最後關掉registry和在HKEY_LOCAL_MACHINE裡刪除"SOFTWARE\microsoft\Windows\CurrentVersion\Run\hello"的key.



===============================================================

Option Explicit

'Registry Security Attributes TYPE

Private Type SECURITY_ATTRIBUTES

    nLength As Long

    lpSecurityDescriptor As Long

    bInheritHandle As Boolean

End Type



' Constants for Registry top-level keys

Private Const HKEY_CURRENT_USER = &H80000001

Private Const HKEY_LOCAL_MACHINE = &H80000002

Private Const HKEY_USERS = &H80000003

Private Const HKEY_CLASSES_ROOT = &H80000000



' Return values

Private Const ERROR_SUCCESS = 0&

Private Const ERROR_MORE_DATA = 234



' RegCreateKeyEx options

Private Const REG_OPTION_NON_VOLATILE = 0



' RegCreateKeyEx Disposition

Private Const REG_CREATED_NEW_KEY = &H1

Private Const REG_OPENED_EXISTING_KEY = &H2



' Registry data types

Private Const REG_NONE = 0

Private Const REG_SZ = 1

Private Const REG_BINARY = 3

Private Const REG_DWORD = 4



' Registry security attributes

Private Const KEY_QUERY_VALUE = &H1

Private Const KEY_SET_VALUE = &H2

Private Const KEY_CREATE_SUB_KEY = &H4

Private Const KEY_ENUMERATE_SUB_KEYS = &H8

Private Const KEY_ALL_ACCESS = &H3F



Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long

Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long

Private Declare Function RegQueryValueEx Lib "advapi32.dll" 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.dll" 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

Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long

Private Declare Function RegCreateKeyEx Lib "advapi32.dll" 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, lpSecurityAttributes As SECURITY_ATTRIBUTES, phkResult As Long, lpdwDisposition As Long) As Long

Private Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As Long



Private Sub Form_Load()

    Dim error As Long

    Dim key As Long

    Dim value As String

    Dim size As Long

    Dim valType As Long

    Dim depth As Long

    Dim lpAttr As SECURITY_ATTRIBUTES



    lpAttr.nLength = 50

    lpAttr.lpSecurityDescriptor = 0

    lpAttr.bInheritHandle = True



'新增一個"SOFTWARE\microsoft\Windows\CurrentVersion\Run\hello"的key

    error = RegCreateKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\microsoft\Windows\CurrentVersion\Run\hello", 0, REG_SZ, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, lpAttr, key, depth)

    If (error <> ERROR_SUCCESS) Then

        End

    End If



'新增一個hello的字串值, 值為"hello"

    error = RegSetValueEx(key, "hello", 0, REG_SZ, "hello", 6)

    If (error <> ERROR_SUCCESS) Then

        End

    End If

'關掉registry

   RegCloseKey (key)



'在HKEY_LOCAL_MACHINE打開"SOFTWARE\microsoft\Windows\CurrentVersion\Run\hello"的key.

    error = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\microsoft\Windows\CurrentVersion\Run\hello", 0, KEY_ALL_ACCESS, key)

    If (error <> ERROR_SUCCESS) Then

        End

    End If

    value = String$(1024, 0)

    size = 1024



'讀取hello字串值的值

error = RegQueryValueEx(key, "hello", 0, valType, value, size)

    If (error <> ERROR_SUCCESS) Then

        End

    End If



'刪除hello字串值

error = RegDeleteValue(key, "hello")

    If (error <> ERROR_SUCCESS) Then

        End

    End If



'關掉registry   

    RegCloseKey (key)



'在HKEY_LOCAL_MACHINE裡刪除"SOFTWARE\microsoft\Windows\CurrentVersion\Run\hello"的key

    error = RegDeleteKey(HKEY_LOCAL_MACHINE, "SOFTWARE\microsoft\Windows\CurrentVersion\Run\hello")

    If (error <> ERROR_SUCCESS) Then

        End

    End If

End Sub



==========================================================

P.S. 修改hello的值跟新增hello字串值都用RegSetValueEx只不過最後兩個輸入值不同而以



例句:

RegSetValueEx(key, "hello", 0, REG_SZ, "hello world", 12)

會把hello裡的值改為hello world.

==========================================================

可以講在registry裡每一個文件夾(key)可以說是一般的文件夾(folder). 你如果要改文件夾裡面的值你就要先打開文件夾(key)

因微軟的registry分成好幾種類型. 像HKEY_LOCAL_MACHINE(你現在所用的電腦), HKEY_CURRENT_USER(你自己)等等. 所以你再開文件夾(key)時要告訴電腦你要開的文件夾(key)是哪一種類型. 當然, 你也要告訴電腦你要開的文件夾的住址.



RegOpenKeyEx是用來打開文件夾, 用法是

RegOpenKeyEx(a, b, c, d,e)

a是你要開的文件夾(key)的類型, HKEY_CURRENT_USER還是HKEY_LOCAL_MACHINE還是其它

b是你要開的文件夾(key)的住址. 像我要開"SOFTWARE\microsoft\Windows\CurrentVersion\Run\hello"就傳進"SOFTWARE\microsoft\Windows\CurrentVersion\Run\hello"

c是微軟保留的輸入值. 所以你可以傳進0.

d是存取控制. 你只要傳進KEY_ALL_ACCESS就可以.(這跟你開檔案時傳進mode一樣, ios::read, ios::app)

e是結果. 如果你成功的打開文件夾(key)的話, e代表你剛剛打開的文件夾.







開了之後你才可以用e來讀取/更新/刪除/建立文件夾裡面的值.

RegQueryValueEx是用來讀取文件夾裡面的值.

RegDeleteValue是用來刪除文件夾裡面的值.

RegSetValueEx是用來更新和建立文件夾裡面的值.





像如果我要讀取在SOFTWARE\microsoft\Windows\CurrentVersion\Run\hello裡的hello的值我可以用

RegQueryValueEx(e, "hello", 0, type, value, size)



type, value, size都是輸出值. type代表"hello"是什麼值, 可能是字串值, DWORD, 或Binary等等.

value是"hello"的值. size是"hello"的值佔有的記憶體空間.

一般來講你要先空出足夠的記憶體空間才行. 所以我在叫RegQueryValueEx以前

value = String$(1024, 0)

size = 1024

這兩行空出1024個記憶體空間.

頁: [1]

Powered by Discuz! Archiver 7.0.0  © 2001-2009 Comsenz Inc.