レジストリ(総合)

今回は悪名高きレジストリ操作です。書き込み、読み込み、削除を全てやります。
まず、レジストリのことが分からない方は、以下の参考サイトを読んでください。
そこそこ知っている方は、「レジストリに書き込む」から読み進めてください。

レジストリとは、Windows最大のゴミの溜まり場です。
アプリの設定やファイルの関連付け、Windowsの設定、ユーザー設定などが、ここに入っています。
そのため、取り扱いは慎重に行う必要があります。

参考サイト
レジストリとは? (ホーム eXDefender)

レジストリに書き込む

使う関数は、RegCreateKeyExとRegSetValueEx、RegCloseKeyの3つだけです。
それぞれレジストリキーを開いて、データをセットしてキーを閉じる。これだけです。
ただ、引数が多いので面倒です。また、書き込む位置を間違えると大変なことになるかもしれません。
細心の注意を払って下さい。(この点、INIファイルなら全然怖くないけどね)

以下のコードは、キー「HKEY_CURRENT_USER\Software\ABC_hikky」の、
値nameにI'm 6hotterを、値hitに6をセットします。
'レジストリにデータを書き込む
Dim hKey As HKEY
Dim result As DWord
Dim ret As Long
Dim nam[100] As Byte
Dim hit As DWord

ret = RegCreateKeyEx(HKEY_CURRENT_USER , "Software\ABC_hikky" , _
        0 ,NULL  , REG_OPTION_NON_VOLATILE , KEY_ALL_ACCESS , _
        ByVal NULL  ,  hKey , VarPtr(result))
If ret <> 0 Then
    MessageBox( 0 , "レジストリキー作成に失敗" , "Error" , MB_OK)
    END
End If

'文字列を読み込む
lstrcpy(nam , "I'm 6hotter")
ret = RegSetValueEx(hKey , "name" ,0 , REG_SZ , nam , lstrlen(nam))
If ret <> ERROR_SUCCESS  Then
    MessageBox( 0 , "データ書き込みに失敗" , "Error" , MB_OK)
    GOTO *OSOUJI
End If

'数値
hit = 6
ret = RegSetValueEx(hKey , "hit" ,0 , REG_DWORD , VarPtr(hit) , 4)
If ret <> ERROR_SUCCESS  Then
    MessageBox( 0 , "データ書き込みに失敗" , "Error" , MB_OK)
    GOTO *OSOUJI
End If

*OSOUJI    
    RegCloseKey(hKey)
END
実行すれば以下のようになります。
実行後のregedit

レジストリから読み込む

今度はデータを読み込んでみます。
使う関数が少し変わります。RegOpenKeyExとRegQueryValueExとRegCloseKeyを使います。
ポインタを多く使うので、一時変数も多くなっています。
'レジストリからデータを読み込む
Dim hKey As HKEY
Dim ret As Long
Dim nam[100] As Byte
Dim mes[200] As Byte
Dim hit As DWord
Dim regtype As DWord
Dim bufsiz As DWord

ret = RegOpenKeyEx(HKEY_CURRENT_USER , "Software\ABC_hikky" , _
        0 , KEY_ALL_ACCESS , hKey )
If ret <> 0 Then
    MessageBox( 0 , "レジストリキーオープンに失敗" , "Error" , MB_OK)
    END
End If

'文字列を読み込む
bufsiz  = 100
regtype = REG_SZ
ret = RegQueryValueEx(hKey , "name" ,0 , VarPtr(regtype) ,_
         nam , VarPtr(bufsiz))
If ret <> ERROR_SUCCESS  Then
    MessageBox( 0 , "データの読み取り失敗" , "Error" , MB_OK)
    GOTO *OSOUJI
End If

'数値
bufsiz = 4
regtype = REG_DWORD
ret = RegQueryValueEx(hKey , "hit" ,0 , VarPtr(regtype) ,_
         VarPtr(hit) , VarPtr(bufsiz))
If ret <> ERROR_SUCCESS  Then
    MessageBox( 0 , "データの読み取り失敗" , "Error" , MB_OK)
    GOTO *OSOUJI
End If


wsprintf(mes , Ex"name = %s\nhit=%d" , nam , hit)

MessageBox( 0 , mes , "読み取り確認" , MB_OK)

*OSOUJI    
    RegCloseKey(hKey)
END
成功すれば以下のようになります。
読み込み成功

レジストリからキー、データを削除する

最後はキー、データの削除です。神経を使うプログラムです。
値の削除はRegDeleteValue関数、キーの削除はRegDeleteKey関数です。
引数が少ないので簡単です。
間違って、他のキーを削除してしまわないように注意してください。
'レジストリからデータを削除する
Dim hKey As HKEY
Dim ret As Long

ret = RegOpenKeyEx(HKEY_CURRENT_USER , "Software\ABC_hikky" ,_
         0 , KEY_ALL_ACCESS , hKey )
If ret <> 0 Then
    MessageBox( 0 , "レジストリキーオープンに失敗" , "Error" , MB_OK)
    END
End If

'name を削除
ret = RegDeleteValue(hKey , "name" )
If ret <> ERROR_SUCCESS  Then
    MessageBox( 0 , "レジストリの値削除失敗" , "Error" , MB_OK)
    GOTO *OSOUJI
End If

'hit を削除
ret = RegDeleteValue(hKey , "hit" )
If ret <> ERROR_SUCCESS  Then
    MessageBox( 0 , "レジストリの値削除失敗" , "Error" , MB_OK)
    GOTO *OSOUJI
End If

'キーを削除
ret = RegDeleteKey(hKey , "" )
If ret <> ERROR_SUCCESS  Then
    MessageBox( 0 , "レジストリキーの削除失敗" , "Error" , MB_OK)
    GOTO *OSOUJI
End If
*OSOUJI    
    RegCloseKey(hKey)
END