'軟件都有一個關於咱們的菜單,單單實現這個功能並不難,困難的是可以將這些信息寫入註冊表中,這樣每次只要彈出這樣的窗口,就從註冊表裏去搜索。這樣是否是極大的節省了資源。
這裏也是一種通用的用法,例子比較初級。下面是所有的代碼:
Option Explicit ' 註冊表關鍵字安全選項... 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_ALL_ACCESS = KEY_QUERY_VALUE + KEY_SET_VALUE + _ KEY_CREATE_SUB_KEY + KEY_ENUMERATE_SUB_KEYS + _ KEY_NOTIFY + KEY_CREATE_LINK + READ_CONTROL ' 註冊表關鍵字 ROOT 類型... Const HKEY_LOCAL_MACHINE = &H80000002 Const ERROR_SUCCESS = 0 Const REG_SZ = 1 ' 獨立的空的終結字符串 Const REG_DWORD = 4 ' 32位數字 Const gREGKEYSYSINFOLOC = "SOFTWARE\Microsoft\Shared Tools Location" Const gREGVALSYSINFOLOC = "MSINFO" Const gREGKEYSYSINFO = "SOFTWARE\Microsoft\Shared Tools\MSINFO" Const gREGVALSYSINFO = "PATH" 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 RegCloseKey Lib "advapi32" (ByVal hKey As Long) As Long Private Sub cmdSysInfo_Click() Call StartSysInfo End Sub Private Sub cmdOK_Click() Unload Me End Sub Private Sub Form_Load() On Error Resume Next Me.Caption = GetLang("lang_abbout_title") lblVersion.Caption = GetLang("lang_version") & App.Major & "." & App.Minor & "." & App.Revision lblTitle.Caption = GetLang("lang_appname") ImageLogo.Picture = LoadPicture(App.Path & "\logo.jpg") cmdOK.Caption = GetLang("lang_confirm") lblDescription.Caption = GetLang("lang_lblDescription") lblContact.Caption = GetLang("lang_lblContact") End Sub Public Sub StartSysInfo() On Error GoTo SysInfoErr Dim rc As Long Dim SysInfoPath As String ' 試圖從註冊表中得到系統信息程序的路徑及名稱... If GetKeyValue(HKEY_LOCAL_MACHINE, gREGKEYSYSINFO, gREGVALSYSINFO, SysInfoPath) Then ' 試圖僅從註冊表中得到系統信息程序的路徑... ElseIf GetKeyValue(HKEY_LOCAL_MACHINE, gREGKEYSYSINFOLOC, gREGVALSYSINFOLOC, SysInfoPath) Then ' 已知32位文件版本的有效位置 If (Dir(SysInfoPath & "\MSINFO32.EXE") <> "") Then SysInfoPath = SysInfoPath & "\MSINFO32.EXE" ' 錯誤 - 文件不能被找到... Else GoTo SysInfoErr End If ' 錯誤 - 註冊表相應條目不能被找到... Else GoTo SysInfoErr End If Call Shell(SysInfoPath, vbNormalFocus) Exit Sub SysInfoErr: ' MsgBox "此時系統信息不可用", vbOKOnly End Sub Public Function GetKeyValue(KeyRoot As Long, KeyName As String, SubKeyRef As String, ByRef KeyVal As String) As Boolean Dim i As Long ' 循環計數器 Dim rc As Long ' 返回代碼 Dim hKey As Long ' 打開的註冊表關鍵字句柄 Dim hDepth As Long ' Dim KeyValType As Long ' 註冊表關鍵字數據類型 Dim tmpVal As String ' 註冊表關鍵字值的臨時存儲器 Dim KeyValSize As Long ' 註冊表關鍵自變量的尺寸 '------------------------------------------------------------ ' 打開 {HKEY_LOCAL_MACHINE...} 下的 RegKey '------------------------------------------------------------ rc = RegOpenKeyEx(KeyRoot, KeyName, 0, KEY_ALL_ACCESS, hKey) ' 打開註冊表關鍵字 If (rc <> ERROR_SUCCESS) Then GoTo GetKeyError ' 處理錯誤... tmpVal = String$(1024, 0) ' 分配變量空間 KeyValSize = 1024 ' 標記變量尺寸 '------------------------------------------------------------ ' 檢索註冊表關鍵字的值... '------------------------------------------------------------ rc = RegQueryValueEx(hKey, SubKeyRef, 0, _ KeyValType, tmpVal, KeyValSize) ' 得到/建立關鍵字值 If (rc <> ERROR_SUCCESS) Then GoTo GetKeyError ' 處理錯誤 If (Asc(Mid(tmpVal, KeyValSize, 1)) = 0) Then ' Win95 外接程序空終結字符串... tmpVal = Left(tmpVal, KeyValSize - 1) ' Null 被找到,從字符串中分離出來 Else ' WinNT 沒有空終結字符串... tmpVal = Left(tmpVal, KeyValSize) ' Null 沒有被找到, 分離字符串 End If '------------------------------------------------------------ ' 決定轉換的關鍵字的值類型... '------------------------------------------------------------ Select Case KeyValType ' 搜索數據類型... Case REG_SZ ' 字符串註冊關鍵字數據類型 KeyVal = tmpVal ' 複製字符串的值 Case REG_DWORD ' 四字節的註冊表關鍵字數據類型 For i = Len(tmpVal) To 1 Step -1 ' 將每位進行轉換 KeyVal = KeyVal + hex(Asc(Mid(tmpVal, i, 1))) ' 生成值字符。 By Char。 Next KeyVal = Format$("&h" + KeyVal) ' 轉換四字節的字符爲字符串 End Select GetKeyValue = True ' 返回成功 rc = RegCloseKey(hKey) ' 關閉註冊表關鍵字 Exit Function ' 退出 GetKeyError: ' 錯誤發生後將其清除... KeyVal = "" ' 設置返回值到空字符串 GetKeyValue = False ' 返回失敗 rc = RegCloseKey(hKey) ' 關閉註冊表關鍵字 End Function
平時寫慣了代碼,也不多去註釋什麼的,此次爲了發表,寫了很詳盡的註釋。代碼都比較簡單,相信你們也都能看明白。api
這段代碼也是最近才學會的,之前都是習慣直接去讀取軟件的相關信息。歷來沒有去涉及註冊表,說到註冊表,都會想到特別的難。慢慢學習也發現,不難,至少沒有想象中的那麼的難。搜了不少資料,看了一些相關的書籍,總結出來的。世上無難事只怕有心人!安全