...pudding - diary

この日記は https://yapud.hatenablog.com/ に引っ越し中


2011-05-27

_ [Notes][Software] 続・LotusScript でレジストリの中身を取ってきたりする

昨日の日記に書いた話、LotusScript からレジストリの REG_BINARY 型の値を取ってくると変になるという話。

内部では RegQueryValueExA で取ってきてるんですが、いかにあるコードの Byval lpData As String の部分にあるように、取ってきた REG_BINARY の値を String 型の変数に入れています。

Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (Byval Hkey As Long, Byval lpValueName As String, Byval lpReserved As Long, lpType As Long, Byval lpData As String, lpcbData As Long) As Long

バイト列の並びがそっくりそのまま格納されてれば良いのですが、LotusScript さんが気を利かせて日本語文字っぽいところは都合の良いようにコード変換して変数に格納してくれる。おかげで、そのままのバイト列を取り出せない。よけいなことしくさって。

同じ関数を別の名前で定義してあって、 lpData As Any の部分にあるように、取ってきた REG_BINARY の値の型を決め打ちしないよっていうふうになってる。

Declare Function RegQueryValueExAny Lib "advapi32.dll" Alias "RegQueryValueExA" (Byval Hkey As Long, Byval lpValueName As String, Byval lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long

これで取ってきた値をバイト型の配列にキレイに格納すればなんの問題も無く処理できて解決です。こんなふうに。

Dim lValueLength , lDataTypeValue , lKeyValue , lResult As Long
Dim Group, Section, Key As String
Dim bytes() As Byte
 
Group = HKEY_LOCAL_MACHINE
Section = "SOFTWARE\Microsoft\Windows NT\CurrentVersion"
Key = "DigitalProductId"
lValueLength = 1024
ReDim bytes(lValueLength) As Byte
 
lResult = RegOpenKey(Group, Section, lKeyValue)
lResult = RegQueryValueExAny(lKeyValue, Key, 0&, lDataTypeValue, bytes(0), lValueLength)

これで 変数 bytes のなかにバイト型の配列として値が格納された。キレイに1バイトずつに分かれてるのであとは繋ぐなり計算するなり操作し放題です。


2011年
5月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Twitter : @moriya_jp