VB的寫法,關於版本寫入注冊表


'軟件都有一個關於我們的菜單,單單實現這個功能並不難,困難的是能夠將這些信息寫入注冊表中,這樣每次只要彈出這樣的窗口,就從注冊表里去搜索。這樣是不是極大的節省了資源。
這里也是一種通用的用法,例子比較初級。下面是全部的代碼:

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

平時寫慣了代碼,也很少去注釋什么的,這次為了發表,寫了很詳盡的注釋。代碼都比較簡單,相信大家也都能看明白。

這段代碼也是最近才學會的,以前都是習慣直接去讀取軟件的相關信息。從來沒有去涉及注冊表,說到注冊表,都會想到特別的難。慢慢學習也發現,不難,至少沒有想象中的那么的難。搜了很多資料,看了一些相關的書籍,總結出來的。世上無難事只怕有心人!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM