〜 システム 〜
環境変数を削除 (要KERNEL32.DLL)

HSPから環境変数を削除してみるサンプルモジュールの紹介です。
ココで言う環境変数とは、Windows、またはWindows環境下で動作するソフトが使う
何らかの属性やパス等のデータを保存しておく変数のことですが、
API関数SetEnvironmentVariableを使って削除するサンプルを紹介しています。

取得を行うAPI関数GetEnvironmentVariableはシステム環境変数をも取得することが可能なので、
逆のAPI関数SetEnvironmentVariableを使えばシステム環境変数の削除ができるものと思いがちですが
API関数SetEnvironmentVariableは現在のプロセスだけに有効な環境変数を削除するものなので、
「システムのプロパティ」−「詳細設定タブ」−「環境変数()」は変化ありません。
削除失敗であればstatに0が、成功であれば1が返るようになっています。
予め自プロセスで設定しておらず、システム側で設定されている環境変数の削除を行っても削除成功となり、
API関数GetEnvironmentVariableで確認しても、システム環境変数が削除されたかのように見えますが、
取得しようとしたのはシステム側ではなく現在のプロセス側になるので実際に消えてはいません。

下記サンプルでは環境変数を削除するdelev命令と別に環境変数内容を取得するgetev命令も使用してますが、
getev命令は本当に削除が出来たか確認用に取得しているだけであり、削除自体はdelev命令だけでOKです。
尚、取得を行うgetev命令についてはコチラを参照してください。
	

getev 環境変数名, 受取先変数, 最大サイズ
環境変数名取得する環境変数名を指定する。
受取先変数取得した変数内容受取先の文字列型変数を指定する。
最大サイズ受取先変数に格納する最大バイト数を指定する。

delev 環境変数名
環境変数名削除する環境変数名を指定する。

 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
	ll_libload kernel, "kernel32.dll"
	ll_getproc GetEnvironmentVariable, "GetEnvironmentVariableA", kernel
	ll_getproc SetEnvironmentVariable, "SetEnvironmentVariableA", kernel

#module
#deffunc getev str, val, int
	mref name, 32 : mref ev, 25 : mref size, 2
	ll_getptr name : ll_ret prm.0
	ll_getptr ev : ll_ret prm.1
	prm.2 = (size = 0) * 64 + size
	memset ev, , prm.2
	ll_callfunc prm, 3, GetEnvironmentVariable@
	return

#deffunc delev str
	mref name, 32
	mref stt, 64
	ll_getptr name : ll_ret prm.0
	prm.1 = 0
	ll_callfunc prm, 2, SetEnvironmentVariable@
	ll_ret prm : stt = prm
	return
#global

	evname = "TMP"
	getev evname, ev
	mes evname + " = [" + ev + "]"
	delev evname // 削除実行(現在のプロセス側がアクティブになる)
	getev evname, ev
	mes evname + " = [" + ev + "]"
	mes "※削除されたように見えますがシステム環境変数は変わってません"
	stop

受取先 = getev(環境変数名)
受取先取得した変数内容の受取先を指定する。
環境変数名取得する環境変数名を指定する。
最大サイズ取得する最大バイト数を指定する。尚、省略時は260バイトが適用される。

delev 環境変数名
環境変数名削除する環境変数名を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#uselib "kernel32.dll"
#func	global GetEnvironmentVariable "GetEnvironmentVariableA" str, var, int
#func	global SetEnvironmentVariable "SetEnvironmentVariableA" str, int

#module
#defcfunc getev str name, local s
	sdim s, 1000
	GetEnvironmentVariable name, s, 1000
	return s

#deffunc delev str name
	SetEnvironmentVariable name
	return
#global

	evname = "TMP"
	mes evname + " = [" + getev(evname) + "]"
	delev evname // 削除実行(現在のプロセス側がアクティブになる)
	mes evname + " = [" + getev(evname) + "]"
	mes "※削除されたように見えますがシステム環境変数は変わってません"