〜 システム 〜
レジストリの項目値を設定 (要ADVAPI32.DLL)

今回はAPI関数RegSetValueExにハイブ(メインキー・サブキー・名前のセット)を指定して、
項目値を設定します。
レジストリエディタ(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引数に値の名前…つまり、項目名を指定します。 第3引数は予約されているので0を指定してください。 第4引数は設定値のデータ型を指定します。 データ型とは「REG_SZ」や「REG_DWORD」等のタイプのことで以下のいずれかになります。
REG_NONE0定義されていない型。
REG_SZ1NULLで終わる文字列。
REG_EXPAND_SZ2展開前の環境変数への参照が入った文字列。
REG_BINARY3バイナリーデータ。
REG_DWORD
REG_DWORD_LITTLE_ENDIAN
432ビット数値。
REG_DWORD_BIG_ENDIAN5ビッグエンディアン形式の32ビット数値。
REG_LINK6Unicodeシンボリックリンク。
REG_MULTI_SZ7NULLで終わる複数行文字列。
REG_RESOURCE_LIST8デバイスドライバのリソースリスト。
REG_QWORD
REG_QWORD_LITTLE_ENDIAN
1164ビット数値。
上記のうちのいずれかの型を数値で指定します。(例.バイナリ値なら3) 尚、タイプがバイナリ時、「0」だとNULLコード、「"0"」だと30(10進数の48)がセットされます。 下記のHSP3側サンプルでも同様に数値はコード、文字列は文字列コードとして設定します。 第5引数は設定するデータを入れた変数のポインタを指定します。 第6引数は設定データのサイズをバイト数で指定します。 文字列は文字数、32ビット数値なら4バイト分、64ビット数値なら8バイト分を与えてください。 コレらを指定し、設定に成功すると0が、失敗するとエラーコードが返りますが、 設定するキーハンドル(サブキー)が正常であって、項目名だけが不正である場合は設定失敗ではなく、 項目が新規に作成されてそこにセットするようになっています。 設定に失敗するのは主にサブキー自体が存在しない時や、 サブキー及び項目名は合っているがKEY_SET_VALUE(=0x0002)アクセス権がない時です。 HSP3からは型を問わず、変数としてユーザー定義命令・関数のパラメータに指定できますが、 HSP2まではmref命令により数値型・文字列型を指定しなければなりませんので、 HSP3用は1つの設定命令ですが、HSP2用は数値用と文字列用の2つの設定命令を用意しました。 不正な値を設定することでパソコン自体が壊れてしまう可能性があります。 当然ですが、如何なる問題が発生しようとも当方は責任を負いませんので、 実行はバックアップをした上、自己責任でやるようにしてください。 変更直後は大抵変化が見られないと思いますが、パソコンを再起動させれば設定が有効になります。 全然変化しないからといって無茶な設定をしたままパソコンを終了させてしまい、 次回パソコンを使う際にとんでもないことになってしまわないように注意してください。

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

regsetstr 項目名, データ, キーハンドル, タイプフラグ
項目名 値の名前文字列を指定する。
尚、設定成功すれば0、失敗すればエラーコードがstatに代入される。
データ設定するデータを入れた文字列定数または文字列型変数を指定する。
キーハンドルregopenkey命令で取得した対象キーのハンドルを指定する。
タイプフラグデータの型を下記から指定する。尚、省略すると通常の文字列(=1)となる。
1NULLで終わる文字列
2展開前の環境変数への参照が入った文字列
3バイナリーデータ
432ビット数値(リトルエンディアン形式)
532ビット数値(ビッグエンディアン形式)
6Unicodeシンボリックリンク
7NULLで終わる複数行文字列
8デバイスドライバのリソースリスト
1164ビット数値(リトルエンディアン形式)

regsetnum 項目名, データ, キーハンドル, タイプフラグ
項目名 値の名前文字列を指定する。
尚、設定成功すれば0、失敗すればエラーコードがstatに代入される。
データ設定するデータを入れた数値定数または数値型変数を指定する。
キーハンドルregopenkey命令で取得した対象キーのハンドルを指定する。
タイプフラグデータの型を下記から指定する。尚、省略すると通常の数値(=4)となる。
1NULLで終わる文字列
2展開前の環境変数への参照が入った文字列
3バイナリーデータ
432ビット数値(リトルエンディアン形式)
532ビット数値(ビッグエンディアン形式)
6Unicodeシンボリックリンク
7NULLで終わる複数行文字列
8デバイスドライバのリソースリスト
1164ビット数値(リトルエンディアン形式)

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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
	ll_libload advapi, "advapi32.dll"
	ll_getproc RegOpenKeyEx, "RegOpenKeyExA", advapi
	ll_getproc RegSetValueEx, "RegSetValueExA", advapi
	ll_getproc RegSetValueEx, "RegSetValueExA", 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 regsetstr str, str, int, int
	mref name, 32 : mref data, 33 : mref hkey, 2 : mref type, 3
	mref stt, 64
	strlen i, data
	if type ! 3 : i++
	prm = hkey, 0, 0, (type = 0) * 1 + type, 0, i
	ll_getptr name : ll_ret prm.1
	ll_getptr data : ll_ret prm.4
	ll_callfunc prm, 6, RegSetValueEx@
	ll_ret prm : stt = prm
	return

#deffunc regsetnum str, int, int, int
	mref name, 32 : mref data, 1 : mref hkey, 2 : mref type, 3
	mref stt, 64
	if type = 3 {
		s = "" + data
		strlen i, s
	} else {
		if type = 11 : i = 8 : else : i = 4
	}
	prm = hkey, 0, 0, (type = 0) * 4 + type, 0, i
	ll_getptr name : ll_ret prm.1
	ll_getptr data : ll_ret prm.4
	ll_callfunc prm, 6, RegSetValueEx@
	ll_ret prm : stt = prm
	return

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

	valuename = ""
	value = "HSPBC-TIPS"
	gethkey "1"
	path = refstr + "\\software\\hspbc"
	regopenkey key, path // サブキーを開く
	if stat {
		dialog "[ " + path + " ]は存在しません。"
	} else {
		regsetstr valuename, value, key, 1 // 文字列(REG_SZ)を書き込む
		if stat {
			dialog "[ " + path + " ]の[ " + valuename + " ]に書き込めませんでした",, "エラーコード:" + stat
		} else {
			dialog "[ " + path + " ]の[ " + valuename + " ]に[ "+ value + " ]を書き込みました"
		}
		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全ての処理を許可

regsetvalue キーハンドル, 項目名, データ, タイプフラグ
キーハンドル regopenkey命令で取得した対象キーのハンドルを指定する。
尚、設定に成功(=0)したか失敗(=エラーコード)したかの状態がstatに返る。
項目名値の名前文字列を指定する。
データ設定するデータを入れた変数を指定する。
タイプフラグデータの型を下記から指定する。尚、省略すると通常の文字列(=1)となる。
1NULLで終わる文字列
2展開前の環境変数への参照が入った文字列
3バイナリーデータ
432ビット数値(リトルエンディアン形式)
532ビット数値(ビッグエンディアン形式)
6Unicodeシンボリックリンク
7NULLで終わる複数行文字列
8デバイスドライバのリソースリスト
1164ビット数値(リトルエンディアン形式)

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

#deffunc regsetvalue int hkey, str name, var data, int type, local i
	if type = 0 | type = 1 | type = 2 | type = 6 | type = 7 | type = 8 : data = str(data) : i = strlen(data) + 1
	if type = 4 | type = 5 : data = int(data) : i = 4
	if type = 3 : i = strlen(str(data))
	if type = 11 : i = 8
	RegSetValueEx hkey, name, , (type = 0) * 1 + type, data, i
	return
#global

	path = gethkey("1") + "\\software\\hspbc\\"
	valuename = ""
	value = "HSPBC-TIPS"
	// サブキーを開く
	if regopenkey(key, path) {
		dialog "[ " + path + " ]は存在しません。"
	} else {
		regsetvalue key, "", value, 1 // 文字列(REG_SZ)を書き込む
		if stat {
			dialog "[ " + path + " ]の[ " + valuename + " ]に書き込めませんでした",, "エラーコード:" + stat
		} else {
			dialog "[ " + path + " ]の[ " + valuename + " ]に[ "+ value + " ]を書き込みました"
		}
		regclose key // サブキーを閉じる
	}
	end