〜 システム 〜
レジストリのサブキーを選択 (要ADVAPI32.DLL)

レジストリの簡単な説明はコチラを参照願います。
既に作成されているレジストリのサブキーを操作するにはAPI関数RegOpenKeyExを使用し、
まずは対象キーを開かなければなりません。
第1引数には「レジストリエディタ(regedit.exe)を見たことある人は承知の通りの5種類存在する」
以下のメインキーのうちのいずれかを指定します。

HKEY_CLASSES_ROOT(=0x80000000)」  拡張子や関連付け等のファイルそのものに関するキー。通称「HKCR」。 「HKEY_CURRENT_USER(=0x80000001)」  字の如く、現在のログインユーザーに関するキー。通称「HKCU」。 「HKEY_LOCAL_MACHINE(=0x80000002)」  全ユーザー共通のシステム全体の設定に関するキー。通称「HKLM」。 「HKEY_USERS(=0x80000003)」  ウィンドウズの初期情報とユーザー毎の設定に関するキー。通称「HKU」。 「HKEY_CURRENT_CONFIG(=0x80000005)」  現在のシステム設定に関するキー。通称「HKCC」。

0x80000004が飛んでいますが、ソレは「4という数字が縁起悪い数字だから」とかそんな理由ではなく、 下記のように存在はするのですが、上記の5種類とは違って実際のレジストリではないのです。

HKEY_PERFORMANCE_DATA(=0x80000004)」  ウィンドウズ2000等のNT系のみに存在する現在のステータス等の各種情報。 「HKEY_DYN_DATA(=0x80000006)」  ウィンドウズ95や98等の9X系のみに存在する現在のステータス等の各種情報。

第2引数はサブキー名(を格納した変数のポインタ)を指定します。 注意点として、ウィンドウズ9X系では無視されますがNT系だとエラーになるので、 から始まる名称は付けない様にしてください。 第3引数は将来のために予約されたものであり、0を指定してください。 第4引数はキーに割り当てるべきセキュリティアクセス権を示すアクセスマスクの組み合わせを指定しますが、 通常はKEY_ALL_ACCESS(=0x000F003F)を指定します。
KEY_QUERY_VALUE0x0001サブキーデータの問い合わせを許可。
KEY_SET_VALUE0x0002サブキーデータの設定を許可。
KEY_CREATE_SUB_KEY0x0004サブキーの作成を許可。
KEY_ENUMERATE_SUB_KEYS0x0008サブキーの列挙を許可。
KEY_NOTIFY0x0010変更の通知を許可。
KEY_CREATE_LINK0x0020シンボリックリンクの作成を許可。
KEY_WRITE0x00020006STANDARD_RIGHTS_WRITE + KEY_CREATE_SUB_KEY + KEY_SET_VALUE
KEY_READ
KEY_EXECUTE
0x00020019STANDARD_RIGHTS_READ + KEY_QUERY_VALUE +
KEY_ENUMERATE_SUB_KEYS + KEY_NOTIFY
KEY_ALL_ACCESS0x000F003FSTANDARD_RIGHTS_REQUIRED + KEY_QUERY_VALUE + KEY_ENUMERATE_SUB_KEYS +
KEY_NOTIFY + KEY_CREATE_SUB_KEY + KEY_CREATE_LINK + KEY_SET_VALUE
第5引数は当API関数によって開かれたサブキーのハンドルを受け取る変数を指定します。 パラメータ数が多いですが、サブキーの作成から読み進んでいる人にとっては、 同様のパラメータばかりで、作成よりも簡単だと思えるかもしれません。 但し、オープン処理を行うだけでは、サブキーの作成等と違って正常にオープンできたか確認できません。 とりあえず、値が0以外なら何らかのサブキーはオープンできていることには間近いないですが。 値が0以外なら、そのまま次の処理に進んでみてください。 尚、以後の処理で取得したキーを対象とするわけですが、処理を終えた後は必ず解放してあげましょう。 レジストリキーをクローズするAPI関数はRegCloseKeyです。 指定するのは、むろん言うまでもなく、上記のオープンしたキーです。

gethkey キー文字列
キー文字列 定義済キー文字列を指定するとメインキーの定義値を返し、
以下の数値文字列を指定すれば定義済キー文字列を返す。
"0"HKEY_CLASSES_ROOT
"1"HKEY_CURRENT_USER
"2"HKEY_LOCAL_MACHINE
"3"HKEY_USERS
"4"HKEY_PERFORMANCE_DATA
"5"HKEY_CURRENT_CONFIG
"6"HKEY_DYN_DATA

regopenkey 受取変数, キー文字列, アクセスマスク
受取変数開く対象のキーハンドル受取先変数を指定する。
尚、オープン成功なら0、失敗ならエラーコードがstatに代入される。
キー文字列オープンするキーのパス(メインキー+サブキー)を指定する。
アクセスマスク以下に示すキーのセキュリティ権を指定する。
0x0001サブキーデータの問い合わせを許可
0x0002サブキーデータの問い合わせを許可
0x0004サブキーの作成を許可
0x0008サブキーの列挙を許可
0x0010変更の通知を許可
0x0020シンボリックリンクの作成を許可
0x00020006読込系の処理を許可
0x00020019書込系の処理を許可
0x000F003F全ての処理を許可

regclose キーハンドル
キーハンドル使い終わって解放する、または設定し終えて更新するキーハンドルを指定する。

 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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
	ll_libload advapi, "advapi32.dll"
	ll_getproc RegOpenKeyEx, "RegOpenKeyExA", advapi
	ll_getproc RegCloseKey, "RegCloseKey", advapi

#module
#deffunc gethkey str
	mref string, 32
	sdim s, 22, 7
	mref stt, 64
	mref rstr, 65
	s.0 = "HKEY_CLASSES_ROOT", "HKEY_CURRENT_USER", "HKEY_LOCAL_MACHINE", "HKEY_USERS"
	s.4 = "HKEY_PERFORMANCE_DATA", "HKEY_CURRENT_CONFIG", "HKEY_DYN_DATA"
	strmid rstr, string, 0, 1
	if rstr ! "H" {
		i = 0 + rstr
		rstr = s.i
		return
	}
	instr i, string, "\\"
	if i ! -1 : strmid rstr, string, 0, i : else : rstr = string
	stt = 0
	repeat 7
		if s.cnt = rstr {
			stt = 0x80000000 + cnt
			instr i.0, string, "\\"
			strlen i.1, string
			strmid rstr, string, i + 1, i.1 - i.0 - 1
			break
		}
	loop
	return

#deffunc regopenkey val, str, int
	mref hkey, 16 : mref path, 33 : mref sa, 3
	mref stt, 64
	gethkey path
	if stat = 0 : return
	path = refstr
	prm = stat, 0, 0, (sa = 0) * 0x000F003F + sa
	ll_getptr path : ll_ret prm.1
	ll_getptr hkey : ll_ret prm.4
	ll_callfunc prm, 5, RegOpenKeyEx@
	ll_ret prm : stt = prm
	return

#deffunc regclose int
	mref hkey, 0
	ll_callfunc hkey, 1, RegCloseKey@
	return
#global

	sdim keyname, 22
	gethkey "1"
	path = refstr + "\\software\\hspbc"
	regopenkey key, path // サブキーを開く
	if stat {
		dialog "[ " + path + " ]は存在しません。"
	} else {
		regclose key // サブキーを閉じる
		dialog "[ " + path + " ]を開いた後、何もせずにクローズしました"
	}

定義済情報 = gethkey(キー文字列)
定義済情報定義済情報の受取先を指定する。
キー文字列 定義済キー文字列を指定するとメインキーの定義値を返し、
以下の数値文字列を指定すれば定義済キー文字列を返す。
"0"HKEY_CLASSES_ROOT
"1"HKEY_CURRENT_USER
"2"HKEY_LOCAL_MACHINE
"3"HKEY_USERS
"4"HKEY_PERFORMANCE_DATA
"5"HKEY_CURRENT_CONFIG
"6"HKEY_DYN_DATA

エラーコード = regopenkey(受取変数, キー文字列, アクセスマスク)
エラーコードオープン成功(=0)したか失敗(=エラーコード)したかの状態受取先を指定する。
受取変数開く対象のキーハンドル受取先変数を指定する。
キー文字列オープンするキーのパス(メインキー+サブキー)を指定する。
アクセスマスク以下に示すキーのセキュリティ権を指定する。
0x0001サブキーデータの問い合わせを許可
0x0002サブキーデータの問い合わせを許可
0x0004サブキーの作成を許可
0x0008サブキーの列挙を許可
0x0010変更の通知を許可
0x0020シンボリックリンクの作成を許可
0x00020006読込系の処理を許可
0x00020019書込系の処理を許可
0x000F003F全ての処理を許可

regclose キーハンドル
キーハンドル使い終わって解放する、または設定し終えて更新するキーハンドルを指定する。

 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
32
33
34
35
36
#uselib "advapi32.dll"
#cfunc global RegOpenKeyEx "RegOpenKeyExA" int, sptr, int, int, var
#func  global regclose "RegCloseKey" int

#module
#defcfunc gethkey str string, local i, local s
	mref rstr, 65
	s.0 = "HKEY_CLASSES_ROOT", "HKEY_CURRENT_USER", "HKEY_LOCAL_MACHINE", "HKEY_USERS"
	s.4 = "HKEY_PERFORMANCE_DATA", "HKEY_CURRENT_CONFIG", "HKEY_DYN_DATA"
	rstr = string
	if strmid(rstr, 0, 1) ! "H" : return s(int(rstr)) // コード指定ならメインキー名を返す
	if instr(rstr, , "\\") ! -1 : rstr = strmid(rstr, 0, instr(rstr, , "\\"))
	foreach s
		if s.cnt = rstr {
			i = 0x80000000 + cnt
			rstr = string
			rstr = strmid(rstr, instr(rstr, , "\\") + 1, strlen(rstr) - instr(rstr, , "\\") - 1)
			break
		}
	loop
	return i // キー指定ならハンドルを返す

#defcfunc regopenkey var hkey, var path, int sa, local s
	return RegOpenKeyEx(int(gethkey(path)), refstr, , (sa = 0) * 0x000F003F + sa, hkey)
#global

	sdim keyname, 22
	path = gethkey("1") + "\\software\\hspbc"
	// サブキーを開く
	if regopenkey(key, path) {
		dialog "[ " + path + " ]は存在しません。"
	} else {
		regclose key // サブキーを閉じる
		dialog "[ " +path + " ]を開いた後、何もせずにクローズしました", , "ハンドル:" + key
	}
	end