〜 ネットワーク 〜
サーバー上のリソースを削除 (要WININET.DLL)

HSP3からHSPInet.DLLが標準で同梱されており、
このDLLの命令を使うことでインターネット上のデータを取り込むことが出来ます。
便利なものですが、作成した実行ファイルと共にDLLを同梱する必要があるので、
様々な理由により「なんとかDLLナシで実現できないか」と思う人たちの為の参考Tips。
HSPInet.DLLは、Windows標準搭載のWinInet.DLLのラッパーDLLなので、
WinInet.DLLのAPI関数を直接呼び出すことで、
HSPInet.DLLを同梱することなく実現させることが可能となります。

今回はFTPサーバーのリソースを削除するftpdelete命令に取って代わる
WinInet.DLLのAPI関数FtpDeleteFileを使ったサンプルモジュールを紹介します。
API関数FtpDeleteFileに指定するのは第1引数から順に「セッションハンドル」「削除リソース名」です。
セッションハンドルはサーバーと接続した際のログインセッションハンドルを、
削除リソース名は削除対象のリソース名をそれぞれ指定してください。
API関数FtpDeleteFileの戻り値は成功した(=1)か否(=0)かを示す真偽値です。
この値を元に削除成功・失敗を判断すると良いでしょう。

カレントディレクトリ以外のリソースを削除するには対象ディレクトリを変更しておく必要があります。
コチラを参考にしてカレントディレクトリを予め変更しておいてください。
	

inetinit
[パラメータなし]インターネットサービスを開始するだけである為、パラメータは必要ない。

inetend
[パラメータなし]インターネットハンドルを解放するだけの為、パラメータは必要ない。
尚、終了時に自動的に呼び出されるので命令を実行する必要はない。

inetlogin サーバー, ユーザー情報, サービス, オプション
サーバーホストサーバーアドレスまたはIPアドレス文字列を指定する。
ユーザー情報ログインユーザー名とパスワードをコロンで区切った形式で指定する。
サービス接続するサービス(1:FTP 2:Gopher 3:HTTP)を指定する。
尚、省略すればFTP接続を行う。
オプションFTPでパッシブモード利用する時、HTTPでHTTPS通信する時は1を指定する。
それ以外の時は0または省略する。

inetlogout
[パラメータなし]サーバーとの接続を解除するだけの為、パラメータは必要ない。
尚、終了時に自動的に呼び出されるので命令を実行する必要はない。

inetdelete リソース名
リソース名削除対象リソース名を指定する。尚、statには失敗した(=0)か成功した(=1)かのフラグが返る。

 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 wininet, "wininet.dll"
	ll_getproc InternetOpen, "InternetOpenA", wininet
	ll_getproc InternetCloseHandle, "InternetCloseHandle", wininet
	ll_getproc InternetConnect, "InternetConnectA", wininet
	ll_getproc FtpDeleteFile, "FtpDeleteFileA", wininet

#module
#deffunc inetinit
	mref stt, 64
	prm = 0, 0, 0, 0, 0
	agent = "hspbc"
	ll_getptr agent : ll_ret prm
	ll_callfunc prm, 5, InternetOpen@
	ll_ret hinet : stt = hinet
	return

#deffunc inetend onexit
	if hinet : ll_callfunc hinet, 1, InternetCloseHandle@
	return

#deffunc inetlogin str, str, int, int
	mref server, 32 : mref info, 33 : mref service, 2 : mref option, 3
	mref stt, 64
	instr i, info, ":"
	strlen i.1, info
	strmid user, info, , i
	strmid pass, info, i + 1, i.1 - i - 1
	if hinet = 0 : inetinit
	if user = "" : i.0 = 0 : else : ll_getptr user : ll_ret i.0
	if pass = "" : i.1 = 0 : else : ll_getptr pass : ll_ret i.1
	switch service
	case 2:  i.2 = 0x0002, 0 : swbreak
	case 3:  i.2 = 0x0003, 0 : swbreak
	default: i.2 = 0x0001, option ! 0 * 0x08000000
	swend
	ll_getptr server : ll_ret i.5
	prm = hinet, i.5, 0, i.0, i.1, i.2, i.3, 0
	ll_callfunc prm, 8, InternetConnect@
	ll_ret hsess : stt = hsess
	return

#deffunc inetlogout onexit
	if hsess : ll_callfunc hsess, 1, InternetCloseHandle@
	return	

#deffunc inetdelete str
	mref file, 32
	mref stt, 64
	prm = hsess, 0
	ll_getptr file : ll_ret prm.1
	ll_callfunc prm, 2, FtpDeleteFile@
	ll_ret prm : stt = prm
	return
#global

	sdim v, 128, 4
	pos  10,  10 : mes "FTPサーバー"
	pos 150,  10 : input v.0, 150, 22
	pos  10,  40 : mes "ユーザー名"
	pos 150,  40 : input v.1, 150, 22
	pos  10,  70 : mes "パスワード"
	pos 150,  70 : input v.2, 150, 22
	pos  10, 100 : mes "削除リソース名"
	pos 150, 100 : input v.3, 150, 20
	pos  10, 130 : button "削除", *connect
	stop

*connect
	inetlogin v, v.1 + ":" + v.2
	if stat {
		inetdelete v.3
		if stat {
			dialog "リソースを削除しました"
		} else {
			dialog "接続には成功しましたがリソースの削除に失敗しました"
		}
	} else {
		dialog "接続に失敗しました"
	}
	stop

inetinit
[パラメータなし]インターネットサービスを開始するだけである為、パラメータは必要ない。

inetend
[パラメータなし]インターネットハンドルを解放するだけの為、パラメータは必要ない。
尚、終了時に自動的に呼び出されるので命令を実行する必要はない。

inetlogin サーバー, ユーザー, パスワード, サービス, オプション
サーバーホストサーバーアドレスまたはIPアドレス文字列を指定する。
ユーザーログインユーザー名を指定する。
パスワードログインパスワードを指定する。
サービス接続するサービス(1:FTP 2:Gopher 3:HTTP)を指定する。
尚、省略すればFTP接続を行う。
オプションFTPでパッシブモード利用する時、HTTPでHTTPS通信する時は1を指定する。
それ以外の時は0または省略する。

inetlogout
[パラメータなし]サーバーとの接続を解除するだけの為、パラメータは必要ない。
尚、終了時に自動的に呼び出されるので命令を実行する必要はない。

inetdelete リソース名
リソース名削除対象リソース名を指定する。尚、statには失敗した(=0)か成功した(=1)かのフラグが返る。

 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
#uselib "wininet.dll"
#cfunc	global InternetOpen "InternetOpenA" sptr, int, int, int, int
#func	global InternetCloseHandle "InternetCloseHandle" int
#cfunc	global InternetConnect "InternetConnectA" int, sptr, int, int, int, int, int, int
#cfunc	global FtpDeleteFile "FtpDeleteFileA" int, sptr

#module
#deffunc inetinit
	hinet = InternetOpen("hspbc")
	return hinet

#deffunc inetend onexit
	if hinet : InternetCloseHandle hinet
	return

#deffunc inetlogin str server, str user, str pass, int service, int option, local i, local s
	if hinet = 0 : inetinit
	s = user, pass
	if user = "" : i.0 = 0 : else : i.0 = varptr(s.0)
	if pass = "" : i.1 = 0 : else : i.1 = varptr(s.1)
	switch service
	case 2:  i.2 = 0x0002, 0 : swbreak
	case 3:  i.2 = 0x0003, 0 : swbreak
	default: i.2 = 0x0001, (option ! 0) * 0x08000000
	swend
	hsess = InternetConnect(hinet, server, , i.0, i.1, i.2, i.3)
	return hsess

#deffunc inetlogout onexit
	if hsess : InternetCloseHandle hsess
	return

#deffunc inetdelete str file
	return FtpDeleteFile(hsess, file)
#global

	sdim v, 128, 4
	pos  10,  10 : mes "FTPサーバー"
	pos 150,  10 : input v.0, 150, 20
	pos  10,  40 : mes "ユーザー名"
	pos 150,  40 : input v.1, 150, 20
	pos  10,  70 : mes "パスワード"
	pos 150,  70 : input v.2, 150, 20
	pos  10, 100 : mes "削除リソース名"
	pos 150, 100 : input v.3, 150, 20
	pos  10, 130 : button gosub "削除", *connect
	stop

*connect
	inetlogin v, v.1, v.2
	if stat {
		inetdelete v.3
		if stat {
			dialog "リソースを削除しました"
		} else {
			dialog "接続には成功しましたがリソースの削除に失敗しました"
		}
	} else {
		dialog "接続に失敗しました"
	}
	return