VB 通過API訪問 Windows 註冊表

來源:互聯網
上載者:User
你希望你的程式能訪問 Windows 註冊表嗎?當然,能訪問龐大的 Windows 註冊表是每個程式設計者都希望的事情,那麼我就告訴你如何通過API函數訪問 Windows 註冊表吧。請先看看下面的 Visual Basic 程式:

  '根鍵常數
  Const HKEY_CLASSES_ROOT = -2147483648#
  Const HKEY_CURRENT_USER = -2147483647#
  Const HKEY_LOCAL_MACHINE = -2147483646#
  Const HKEY_USERS = -2147483645#

  '索引值類型
  Const REG_SZ = 1& '字串值
  Const REG_BINARY = 3& '二進位值
  Const REG_DWORD = 4& 'DWORD 值

  '聲明有關API函數
  Private Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" _
    ( _
     ByVal hKey As Long, _
     ByVal lpSubKey As String, _
     ByRef phkResult As Long _
     ) As Long '建立一個新的主鍵

  Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" _
    ( _
     ByVal hKey As Long, _
     ByVal lpSubKey As String, _
     ByRef phkResult As Long _
    ) As Long '開啟一個主鍵

  Private Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" _
   ( _
    ByVal hKey As Long, _
    ByVal lpSubKey As String _
   ) As Long '刪除一個主鍵

  Private Declare Function RegCloseKey Lib "advapi32.dll" _
   ( _
    ByVal hKey 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 Any, _
    ByVal cbData As Long _
   ) As Long '建立或改變一個索引值,lpData應由預設的ByRef型改為ByVal型

  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 Any, _
    ByRef lpcbData As Long _
   ) As Long '查詢一個索引值,lpData應由預設的ByRef型改為ByVal型

  Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" _
   ( _
    ByVal hKey As Long, _
    ByVal lpValueName As String _
    ) As Long '刪除一個索引值

  '主過程
  Sub Main()
   Dim nKeyHandle As Long, nValueType As Long, nLength As Long
   Dim sValue As String
   sValue = "I am a winner!"
   Call RegCreateKey(HKEY_CURRENT_USER, "New Registry Key", nKeyHandle)
   Call RegSetValueEx(nKeyHandle, "My Value", 0, REG_SZ, sValue, 255)
   sValue = Space(255)
   nLength = 255
   Call RegQueryValueEx(nKeyHandle, "My Value", 0, nValueType, sValue, nLength)
   MsgBox sValue
   Call RegDeleteValue(nKeyHandle, "My Value")
   Call RegDeleteKey(HKEY_CURRENT_USER, "New Registry Key")
   Call RegCloseKey(nKeyHandle)
  End Sub

  來看看程式啟動並執行結果:

  在註冊表的 HKEY_CURRENT_USER 根鍵中多了一個 New Registry Key 主鍵。其中除有一個空的“(預設)”值外,還有一個值為“I am a winner!”的“My Value”值
  下面我們來分析一下這個程式:

  首先是定義常量。前面四個常量是各根鍵的控制代碼,這些控制代碼都是固定的;後三個是索引值類型,在登錄編輯程式中按右鍵主鍵彈出的“建立”功能表項目中,可以看到這三個索引值類型。  
  第二步是聲明API函數。這一步可以通過“API 文本瀏覽器”來完成:用“API 文本瀏覽器”負載檔案“Win32Api.txt”,尋找出上例中的 API 函數並添加到“選定項”一欄中,點取“複製”按鈕,再回到 VB 程式編輯環境,將剪貼簿中的內容粘貼到VB程式編輯器中,這樣就完成了 API 函數的聲明過程。值得注意的是,“RegSetValueEx”和“ RegQueryValueEx”兩個函數中的“lpData”被定義為“Any”類型的,卻沒有定義傳遞方式,於是它被預設為“ByRef”傳遞方式。經筆者測試,這樣不能正確的設定或查詢索引值,但將其傳遞方式改為“ByVal”後,便 OK 了。  

  第三步便是在訪問註冊表了。“RegOpenKey”的用法與“RegCreateKey”的用法是類似的,前者用於開啟一個已存在的主鍵,而後者除了能用於開啟一個已存在的主鍵外,如果該主鍵不存在,還能建立這個主鍵。開啟或建立主鍵成功後將返回一個控制代碼給參數“phkResult”,這個控制代碼將在對索引值的操作中用到,它就是“RegSetValueEx”、“RegQueryValueEx”和“RegDeleteValue”中的“nKeyHandle”參數。  還有一點需要說明,每個主鍵中都有一個索引值名顯示為“(預設)”,但其索引值名並不就是“(預設)”,而是一個Null 字元串。

  現在,你知道怎樣通過API函數訪問Windows註冊表了嗎?

-=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=-
 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.