/***********************************************************
標準出力をパイプにリダイレクトしてコンソール・
アプリケーションを実行し、その出力を変数で受け取る
【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
|