〜 システム 〜
システム環境変数を設定 (要ADVAPI32.DLL)

HSPからシステム環境変数を設定してみるサンプルモジュールの紹介です。
ココで言う環境変数とは、Windows、またはWindows環境下で動作するソフトが使う
何らかの属性やパス等のデータを保存しておく変数のことですが、
コチラで紹介したAPI関数SetEnvironmentVariableを使って設定した環境変数は、
現在のプロセスにしか有効ではなく、プログラムが終了すれば使えなくなってしまいますし、
他のプログラムと連携させることも出来ません。
「システムのプロパティ」−「詳細設定タブ」−「環境変数()」で確認できるもシステム環境変数は
存在しないからなのか設定できるAPIは探しても見つからず、
設定するにはレジストリを経由して行うしか有効な方法はありませんでした。
システム環境変数のレジストリパス「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment」
ユーザー環境変数のレジストリパス「HKEY_CURRENT_USER\Environment」となっています。
当然のことながら、削除も上記のレジストリを削除することになります。
レジストリ操作はヘタするとパソコンが起動できなくなる大変危険な処理ですので十分に注してください。

尚、レジストリに設定し終えてもパソコンを再起動しなければ環境変数は有効になりません。
設定後すぐに取得をしようとしても、うまく取得できないので覚えて起きましょう。

レジストリ操作モジュールはコチラコチラで紹介している汎用Tipsを使用しています。
モジュールの詳細については上記の汎用Tipsを紹介しているリンク先のテキストを参照してください。
	

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ビット数値(リトルエンディアン形式)

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
	ll_libload advapi, "advapi32.dll"
	ll_getproc RegOpenKeyEx, "RegOpenKeyExA", 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 regclose int
	mref hkey, 0
	ll_callfunc hkey, 1, RegCloseKey@
	return
#global

	path = "HKEY_CURRENT_USER\\Environment"
	name = "hspbc"
	value = "http://www.rinku.zaq.ne.jp/ultimate/"
	regopenkey key, path
	if stat {
		dialog "[ " + path + " ]が存在しません"
	} else {
		regsetstr name, value, key
		regclose key
		dialog "[" + path + "]に[" + value + "]を設定しました"
	}

定義済情報 = 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
#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 = "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment"
	name = "hspbc"
	value = "http://www.rinku.zaq.ne.jp/ultimate/"
	if regopenkey(key, path) {
		dialog "[ " + path + " ]が存在しません"
	} else {
		regsetvalue key, name, value
		regclose key
		dialog "[" + path + "]に[" + value + "]を設定しました"
	}
	end