〜 ネットワーク 〜
同時ダウンロード可能数を変更 (要ADVAPI32.DLL)

インターネットエクスプローラを使用してファイルをダウンロードする時、
HTTP1.1の仕様を提唱するRFC2616により、同時ダウンロード数が2つと設定されています。
サーバー側で数を制限されている場合は話が変わってきますが、
この上限はレジストリを操作することにより変更可能となっており、
ブロードバンドが普及する今、3つ以上のファイルを同時にダウンロードしても問題ないどころか、
より短時間で全てダウンロードし終えることが可能な場合があります。
レジストリ内で上限数が変更できるものの、デフォルトではどこにも設定がされていないため、
変更する場合は「HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Internet Settings」に
「MaxConnectionsPerServer」というDWORD値を新しく設定する必要があります。
上記はインターネットオプションにて「HTTP1.1を使用する」チェックが付いている場合の設定であり、
HTTP1.0を使用する際は同位置にDWORD値「MaxConnectionsPer1_0Server」を設定してください。
尚、現在のログインユーザー以外でも同時ダウンロードの上限数を変更する場合、
「HKEY_USERS/.DEFAULT/Software/Microsoft/Windows/CurrentVersion/Internet Settings」位置に
「MaxConnectionsPerServer」「MaxConnectionsPer1_0Server」を設定してください。

下記のサンプルでは現在のダウンロード上限数を読み込むだけでなく、
設定ボタンを押すことで実際に変更しますのでご注意ください。
サンプルでは、チェックボックスを押した時に処理ができるよう、ボタンをチェックボックに変更しています。
変更状態を監視せずにクリックされたら自動で処理するやり方の説明はコチラを参照してください。
	

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

reggetvalue 受取変数, 項目名, キーハンドル, タイプフラグ
受取変数データまたはデータの型を受け取る変数を指定する。
尚、取得成功すれば0、失敗すればエラーコードがstatに代入される。
項目名値の名前文字列を指定する。
キーハンドルregopenkey命令で取得した対象キーのハンドルを指定する。
タイプフラグデータは0を、データ型を取得する場合は1を指定する。
尚、取得されるデータ型は次のいずれかの数値である。
0定義されていない型
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
	ll_libload advapi, "advapi32.dll"
	ll_getproc RegOpenKeyEx, "RegOpenKeyExA", advapi
	ll_getproc RegQueryValueEx, "RegQueryValueExA", 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 reggetvalue val, str ,int, int
	mref data, 24 : mref name, 33 : mref hkey, 2 : mref type, 3
	mref stt, 64
	prm = hkey
	i.1 = 256
	ll_getptr name : ll_ret prm.1
	ll_getptr i    : ll_ret prm.3
	ll_getptr data : ll_ret prm.4
	ll_getptr i.1  : ll_ret prm.5
	ll_callfunc prm, 6, RegQueryValueEx@
	ll_ret prm : stt = prm
	if i >= 4 & (i <= 6) | (i = 11) | (type ! 0) : mref data, 16
	if type : data = i
	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

	sdim path, 128
	dat = 2		// 同時DL上限初期値
	gethkey "1"
	path = refstr + "\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"
	regopenkey key, path
	if stat {
		dialog "[ " + path + " ]が存在しません", 1
		end
	}
	objsize 200, 25
	pos 10, 10 : button "HTTP1.1を優先", *priority
	pos 10, 40 : mes "同時DL上限数"
	pos 130, 40 : input dat, 20, 20, 2 
	pos 10, 70 : button "変更する", *change
	objsend 0, 0x00F4, 0x02, nouse // ボタンをチェックボックスに変更
	onexit *exit
	goto *priority

*load
	if http11 {
		reggetvalue dat, "MaxConnectionsPerServer", key
		if stat : reggetvalue dat, "MaxConnectionsPer1_0Server", key
	} else {
		reggetvalue dat, "MaxConnectionsPer1_0Server", key
		if stat : reggetvalue dat, "MaxConnectionsPerServer", key
	}
	objprm 1, dat
	return

*priority
	http11 = 1 - http11
	objsend 0, 0x00F1, http11, nouse
	gosub *load
	stop

*change
	int dat
	if dat < 1 {
		dialog "「1」以上の値を設定してください"
		gosub *load
	} else {
		dialog "同時DL上限数を「" + dat + "」に変更してよろしいですか?", 2
		if stat = 6 {
			if http11 {
				regsetnum "MaxConnectionsPerServer", dat, key, 4
			} else {
				regsetnum "MaxConnectionsPer1_0Server", dat, key, 4
			}
			dialog "変更完了"
		} else {
			gosub *load
		}
	}
	stop

*exit
	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
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
98
99
100
101
#uselib "advapi32.dll"
#cfunc global RegOpenKeyEx "RegOpenKeyExA" int, sptr, int, int, var
#cfunc global RegQueryValueEx "RegQueryValueExA" int, sptr, int, var, var, 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)

#defcfunc reggetvalue var data, int hkey, str name, int type, local i
	i = 256
	i.1 = RegQueryValueEx(hkey, name, , i.2, data, i)
	if type : data = i.2
	return i.1

#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

	sdim path, 128
	dat = 2		// 同時DL上限初期値
	path = gethkey("1") + "\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"
	if regopenkey(key, path) {
		dialog "[ " + path + " ]が存在しません", 1
		end
	}
	objsize 140, 20
	pos 10, 10 : button gosub "HTTP1.1を優先", *priority
	pos 10, 40 : mes "同時DL上限数"
	pos 130, 40 : input dat, 20, 20, 2 
	pos 10, 70 : button gosub "変更する", *change
	sendmsg objinfo(0, 2), 0x00F4, 0x02 // ID0のボタンをチェックボックスに変更
	onexit *exit
	gosub *priority
	stop

*load
	if http11 {
		if reggetvalue(dat, key, "MaxConnectionsPerServer") {
			if reggetvalue(dat, key, "MaxConnectionsPer1_0Server") { }
		}
	} else {
		if reggetvalue(dat, key, "MaxConnectionsPer1_0Server") {
			if reggetvalue(dat, key, "MaxConnectionsPerServer") { }
		}
	}
	objprm 1, dat
	return

*priority
	http11 = 1 - http11
	sendmsg objinfo(0, 2), 0x00F1, http11
	gosub *load
	return

*change
	dat = int(dat)
	if dat < 1 {
		dialog "「1」以上の値を設定してください"
		gosub *load
	} else {
		dialog "同時DL上限数を「" + dat + "」に変更してよろしいですか?", 2
		if stat = 6 {
			if http11 {
				regsetvalue key, "MaxConnectionsPerServer", dat, 4
			} else {
				regsetvalue key, "MaxConnectionsPer1_0Server", dat, 4
			}
			dialog "変更完了"
		} else {
			gosub *load
		}
	}
	return

*exit
	regclose key
	end