レジストリ(総合)
今回は悪名高きレジストリ操作です。書き込み、読み込み、削除を全てやります。
まず、レジストリのことが分からない方は、以下の参考サイトを読んでください。
そこそこ知っている方は、「レジストリに書き込む」から読み進めてください。
レジストリとは、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
実行すれば以下のようになります。

レジストリから読み込む
今度はデータを読み込んでみます。
使う関数が少し変わります。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