/***********************************************************

	標準出力をパイプにリダイレクトしてコンソール・
	アプリケーションを実行し、その出力を変数で受け取る

		【2006/5/20 更新】

***********************************************************/

/* API登録 */
#uselib	"kernel32.dll"
#func	CreatePipe	"CreatePipe"	sptr,sptr,sptr,sptr
#func	CloseHandle	"CloseHandle"	sptr
#func	CreateProcessA	"CreateProcessA"	sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr
#func	ReadFile		"ReadFile"	sptr,sptr,sptr,sptr,sptr

/* 各種定数 */

#const	TRUE		1
#const	FALSE		0
#const	NULL		0

#define	NAME_CB_EXE	"cb.exe"

#const	SIZE_SEC_ATTR	12	// SECURITY_ATTRIBUTES構造体サイズ

// STARTUPINFO構造体パラメータ
#const	SIZE_SUP_INFO		68		// STARTUPINFO構造体サイズ
#const	STARTF_USESHOWWINDOW	0x00000001	// パラメータ使用フラグ(ウィンドウ表示状態)
#const	STARTF_USESTDHANDLES	0x00000100	// パラメータ使用フラグ(標準出入力ハンドル)
#const	SW_HIDE			0		// 起動時ウィンドウを表示しない

#const	SIZE_BUF			1024		// ReadFile読み取りサイズ上限


	/************/
	/* 処理本体 */
	/************/

	mydir = dir_cur				// このスクリプトの起動ディレクトリ

	/* 名無しパイプ作成 */
	secAttr = SIZE_SEC_ATTR, NULL, TRUE		// SECURITY_ATTRIBUTES構造体
	CreatePipe varptr(hRead),varptr(hWrite),varptr(secAttr),0
	if stat=FALSE {
		dialog "パイプの作成に失敗しました。スクリプトを終了します。", 1, "エラー"
		end
	}

	/* パイプの書き込み側を標準出力につないでcb.exeを起動 */
	cmdline		= mydir + "\\" + NAME_CB_EXE
	// STARTUPINFO構造体
	supInfo		= SIZE_SUP_INFO,	NULL,	NULL,	NULL
	supInfo(4)	= 0,		0,	0,	0
	supInfo(8)	= 0,		0,	NULL,	STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES
	supInfo(12)	= SW_HIDE,	NULL,	NULL,	hWrite,	NULL
	// PROCESS_INFOMATION構造体
	dim procInfo,4
	// cb.exeを起動
	CreateProcessA NULL,cmdline,0,0,TRUE,NULL,NULL,NULL,varptr(supInfo),varptr(procInfo)

	/* cb.exe起動のエラーチェック */
	if stat=FALSE {
		CloseHandle hWrite		// パイプの書き込み側ハンドルを閉じる
		dialog NAME_CB_EXE + "の起動に失敗しました。スクリプトを終了します。", 1, "エラー"
		goto *@f
	}

	/* パイプの書き込み側ハンドルを閉じる(スクリプトでは使わない) */
	CloseHandle hWrite
	/* cb.exe関連のハンドルを閉じる(スクリプトでは使わない) */
	CloseHandle procInfo(0)
	CloseHandle procInfo(1)

	/* パイプからcb.exeの出力を読み取る */
	outbuf	= ""			// 出力受け取り用バッファ
	size	= 0			// ReadFile読み取りサイズ
	repeat
		sdim buf,SIZE_BUF+1	// ReadFile用バッファ
		ReadFile hRead,varptr(buf),SIZE_BUF,varptr(size),NULL
		if stat {			// ReadFile成功
			if size=0 {	// 読み取り完了
				break
			}
			outbuf += buf
		}
		else {			// ReadFile失敗
			break
		}
	loop

*@
	/* パイプの読み取り側ハンドルを閉じる */
	CloseHandle hRead

	/* 結果表示 */
	dialog "\""+outbuf+"\"",,"処理結果"
	end