OSシステム制御命令

まずパイプ付き実行に関する命令から入ります。

パイプとは、プログラム間で情報を受け渡すための人工的な入出力チャネルのことです。

要するにpipeexecは「execの実行したファイルの出力をHSPの入力につなぐ」版をします。

    HSPアプリ    HSPを起動しメモ帳をpipeexecで起動

    HSPアプリ    <--   notepad.exe   メモ帳と繋がっている

とまぁわかりにくいイメージ図ですがpipeexecをするとこのような状態になるわけですね。

pipeexecexecと違い初期設定(p2が0)でウィンドウ非表示となっています。

ウィンドウが見たい場合は省略せずにp2に1をいれてください。

実行はコレくらいで置いておいてパイプを監視し情報の取得pipegetに入りましょう。

ヘルプにファイルの実行状況がstatに返ると書いてあります。順番的に、

	1. (1)実行準備中
	2. (2)StdOutPut取得中
	3. (3)StdError取得中
	4. (4)終了準備中
	5. (0)実行終了

普通に使うとこういった順番(カッコ内はstatに返る値)になることでしょう。

1がパイプ実行時に返り、後の2〜5が終了時に返るようです。他にもあるのか知らないです(^^;

普通はメインループで常に監視を続けます。

で次が問題なのですが、監視中に出力先がなくなったらどうなるでしょう?

[終了] <-- notepad.exe情報の送信先プロセスがなくなった

早い話HSPが終了間際にエラーで落ちてしまうことになります。

ですので絶対先にHSPが先に終了することのないようにしてください。

コレの逆のメモ帳が先に終了するのは全然問題が生じませんので安心してください。

#include "hspext.as"
	sdim exe,256
	sdim get,4096
	sdim buf,32000
	exe="ping" ; 試になんか入れておく
	pos 1,3 : mes "アプリケーション"
	pos 130,0 : input exe,450,25
	objsize 60,25
	pos 580,0:button "実行",*running
	pos 0,25 : mesbox buf,640,455,1
	stop

*running
	pipeexec buf,exe,1
	if stat : title "実行失敗" : stop
	repeat
		pipeget get
		if stat=0 : title "実行終了" : break
		if stat=1 : title "実行準備中"
		if stat=2 : title "StdOutPut取得中"
		if stat=3 : title "StdError取得中"
		if stat=4 : title "終了準備中"
		wait 5
	loop
	objprm 2,buf
	strlen len,buf
	objsend 2,$b1,len,len,1 ; ボックス終端にキャレット移動
	tmp=0 ; 変数に0入れなくても初期値が0なので省略してよい
	objsend 2,$b7,tmp,tmp,1 ; 画面内にキャレット来るようにする
	stop

pipeputは実行中のファイルへ0〜255の1バイトのコードを入力データとして送ることが出来ます。

使用頻度が低いものですのでパイプ付き実行はコレくらいで終了としますね(逃げ

 

次に、バージョン2.6から標準命令に仲間入りしたsysinfoを紹介しましょう。

取得できるものはOSの種類,コンピュータ・ユーザー名,CPU,メモリ情報です。

取得したものはp1の変数に返ってくるわけですが、取得するものによって数値と文字列がありますので

ループに入れて配列変数に一度に取得するといったことは出来ませんね。

メモリの大容量化・低価格化が進んだ今、2GBを大きく上回るメモリを搭載したPCが数多くありますが、

取得サイズはバイト単位ですので内部仕様により2GB程度までしか取得できません。

#include "hspext.as"
	sdim infostr,64,3
	dim infonum,8
	dim num,8
	num=16,33,34,35,36,37,38,39
	repeat 11
		if cnt<3 : sysinfo infostr.cnt,cnt : else : tmp=cnt-3 : sysinfo infonum.tmp,num.tmp
	loop
	pos 10,10 : mes "OSとバージョン" : pos 200,10 : mes infostr.0
	pos 10,30 : mes "ユーザー名" : pos 200,30 : mes infostr.1
	pos 10,50 : mes "コンピュータ名" : pos 200,50 : mes infostr.2
	pos 10,70 : mes "CPUのコード" : pos 200,70 : mes infonum.0
	pos 10,90 : mes "物理メモリ使用量" : pos 200,90 : mes infonum.1
	pos 10,110 : mes "物理メモリ全体" : pos 200,110 : mes infonum.2
	pos 10,130 : mes "物理メモリ空き" : pos 200,130 : mes infonum.3
	pos 10,150 : mes "スワップ全体" : pos 200,150 : mes infonum.4
	pos 10,170 : mes "スワップ空き" : pos 200,170 : mes infonum.5
	pos 10,190 : mes "全メモリ" : pos 200,190 : mes infonum.6
	pos 10,210 : mes "全メモリ空き" : pos 200,210 : mes infonum.7
	stop

 

最後にsysexitについて説明したいと思います。

命令名から大体は想像付くでしょうがシステムの終了、即ちWindowsを終了する命令です。

9X系での終了はなんら問題はなく普通に終了等ができますが、

NT系の場合は管理者権限のある場合でログオンしている場合のみ終了等が出来ます。

下にサンプルを書きますが実行すると実際に終了してしまうので気をつけてください。

NT系だったり、キャンセルボタンを押せば大丈夫ですけどね…。

#include "hspext.as"
	width 160,80
	objsize 120,25
	pos 20,10 : combox sel,150,"ログオフする\n再起動する\n終了する\nキャンセル"
	pos 20,45 : button "OK",running
	stop

*running
	if sel==3 : end
	sysexit sel
	if sel=2 : sysexit 3
	end

さらっと流しましたけどコレで終了したいと思います。