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

今回はAPI関数RegDeleteKeyを使用してサブキーを削除します。
テストであっても削除してしまうと復活させることは出来ませんのでくれぐれも慎重にしてください。
削除しようとするサブキーの下にサブキーが存在する場合は削除できません。
レジストリエディタ(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」。

ツリーを開くと幾つもぶら下がっている「サブキー」 選択したサブキー右側ペインのリストビューに一覧で表示される項目「名前」と、 タイプ「種類」と項目値「データ」が表示されます。 API関数の第1引数は上記のメインキーのハンドルを指定しますので、 当関数実行の前にコチラで紹介した「ハンドルを取得する関数」を実行します。 第2引数にメインキーより下の削除するサブキーのパスを格納した変数のポインタを指定します。 コレらを指定し、削除に成功すると0が、失敗するとエラーコードが返りますが、 削除に失敗するのはメインキーハンドルが間違っているほか、サブキー自体が存在しない時、 NT系環境においてサブキーの下に別のサブキーが存在する時、 ソレらは合っているがDELETE(=0x10000)アクセス権がない時が考えられます。 DELETEKEY_ALL_ACCESS(=0x000F003F)に含まれているようです。

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全ての処理を許可

regdeletekey キーハンドル, サブキー
キーハンドル regopenkey命令で取得できるメインキーのハンドルを指定する。
尚、設定に成功(=0)したか失敗(=エラーコード)したかの状態がstatに返る。
サブキー削除するサブキーのパスを指定する。

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
	ll_libload advapi, "advapi32.dll"
	ll_getproc RegOpenKeyEx, "RegOpenKeyExA", advapi
	ll_getproc RegDeleteKeyA, "RegDeleteKeyA", 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 regdeletekey int, str
	mref hkey, 0 : mref name, 33
	mref stt, 64
	prm = hkey
	ll_getptr name : ll_ret prm.1
	ll_callfunc prm, 2, RegDeleteKeyA@
	ll_ret prm : stt = prm
	return

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

	gethkey "1" : root = refstr
	sub = "software\\hspbc"
	path = root + "\\" + sub
	regopenkey key, path // サブキーを開く
	if stat {
		dialog "[ " + path + " ]は存在しません。"
	} else {
		dialog "本当に[ " + path + " ]を削除してよろしいですか?", 2
		if stat = 6 {
			gethkey root
			RegDeleteKey stat, sub
			if stat {
				dialog "削除に失敗しました", , "エラーコード:" + stat
			} else {
				dialog "削除しました"
			}
		}
		regclose key // サブキーを閉じる
	}

定義済情報 = 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全ての処理を許可

regdeletekey キーハンドル, サブキー
キーハンドル regopenkey命令で取得できるメインキーのハンドルを指定する。
尚、設定に成功(=0)したか失敗(=エラーコード)したかの状態がstatに返る。
サブキー削除するサブキーのパスを指定する。

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
#uselib "advapi32.dll"
#cfunc global RegOpenKeyEx "RegOpenKeyExA" int, sptr, int, int, var
#func  global RegDeleteKey "RegDeleteKeyA" int, sptr
#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

	root = gethkey("1") // HKEY_CURRENT_USER
	sub = "software\\hspbc"
	path = root + "\\" + sub
	// サブキーを開く
	if regopenkey(key, path) {
		dialog "[ " + path + " ]は存在しません。"
	} else {
		dialog "本当に[ " + path + " ]を削除してよろしいですか?", 2
		if stat = 6 {
			RegDeleteKey gethkey(root), sub // サブキーを削除
			if stat {
				dialog "削除に失敗しました", , "エラーコード:" + stat
			} else {
				dialog "削除しました"
			}
		}
		regclose key // サブキーを閉じる
	}
	end