〜 ソフトウェア 〜
DOSコマンドを取得 (要KERNEL32.DLL)

HSPを使ってMS−DOSのコマンドを実行し、その結果を取得するサンプルです。
HSP3ではCOM操作で、WindowsScriptHost(WSH)の実行結果を直接受け取れますが、
HSP2ではCOMコンポーネント機能を利用でないので、プロンプトを実行して間接的に取得しています。
具体的には、コマンドプロンプトを起動し、コマンド結果をファイル出力、出力ファイルから内容を読込、
読み込んだ内容を表示した後、不要な出力ファイルは削除といった流れです。

尚、コマンドプロンプトは16ビット環境用のcommand.comとNT系から搭載されたcmd.exeの2種類存在し、
利用している環境によってコマンドブロンドのパスが変わることになりますので、
下記のサンプルモジュールでは直接のコマンドブロンドパスは指定せずに、
利用環境に応じたコマンドプロンプトのパスを格納している環境変数ComSpecから取得しています。
COM経由でWSHを使用する時は、名称を%で挟むことで環境変数とみなされるため、
HSP3では%ComSpec%と記述すれば簡単にコマンドプロンプトのパスを取得できますが、
HSP2ではそもそもWSHを呼び出すためのCOMコンポーネントを扱えないので、
別途コチラで紹介した環境変数を取得するやり方でComSpecの内容を取得し、
exec命令の実行対象パスに渡してコマンドプロンプトを起動しています。
	

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

getdoscmd 受取先, コマンド
受取先実行したDOSコマンド結果受取先の文字列型変数を指定する。
尚、命令内部でgetev命令を使用しているため、getdoscmd命令より先にgetev命令を定義すること!
コマンド実行するDOSコマンドテキストを指定する。

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

#module
#define TMPDOSFILE "hspbc_tips_tmpfile"
#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
	ll_callfunc prm, 3, GetEnvironmentVariable@
	return

#deffunc getdoscmd val, str
	sdim comspec, 260
	getev "ComSpec", comspec, 260
	mref data, 24 : mref cmd, 33
	exec comspec + " /c " + cmd + " > " + TMPDOSFILE
	wait 50 // 一時ファイル作成されるまで若干の待ち時間を入れる
	exist TMPDOSFILE
	bload TMPDOSFILE, data, strsize
	delete TMPDOSFILE
	return
#global

	sdim buf, 4096
	getdoscmd buf, "dir c:\\"
	font msmincho, 14 : objmode 2
	mesbox buf, winx, winy, 5
	stop

受取先 = getdoscmd(コマンド)
受取先実行したDOSコマンド結果の受取先を指定する。
コマンド実行するDOSコマンドテキストを指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#module
#deffunc getdoscmd var data, str cmd, local c
	newcom wsh, "WScript.Shell"
	comres c
	wsh-> "Exec" "%ComSpec% /c " + cmd // 環境変数ComSpec内容のパスを実行
	repeat 
		if c("Status") = 0 : break
		wait 1
	loop
	if c("Status") = 0 {
		c = c("StdOut")
		data = c("ReadAll")
	}
	delcom wsh
	return
#global

	sdim buf, 4096
	getdoscmd buf, "dir c:\\" // Cドライブ内のファイル一覧を取得
	font msmincho, 14 : objmode 2
	mesbox buf, ginfo_winx, ginfo_winy, 5