/***********************************************************
2つのコンソール・アプリケーションをパイプでつないで実行
【2005/10/05 更新】
***********************************************************/
#const TRUE 1
#const FALSE 0
#const NULL 0
/* 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 WaitForSingleObject "WaitForSingleObject" sptr,sptr
#const INFINITE 0xFFFFFFFF // WaitForSingleObject待ち時間=無限
/* SECURITY_ATTRIBUTES構造体サイズ */
#const SIZE_SEC_ATTR 12
/* STARTUPINFO構造体パラメータ */
#const SIZE_SUP_INFO 68 // STARTUPINFO構造体サイズ
#const STARTF_USESHOWWINDOW 0x00000001 // パラメータ使用フラグ
#const STARTF_USESTDHANDLES 0x00000100
#const SW_HIDE 0 // 起動時ウィンドウを表示しない
#include "gm_beep.hsp"
/* 名無しパイプ作成 */
secAttr = SIZE_SEC_ATTR, NULL, TRUE // SECURITY_ATTRIBUTES構造体
CreatePipe varptr(hReadPipe),varptr(hWritePipe),varptr(secAttr),0
if stat=FALSE {
dialog "パイプの作成に失敗しました。スクリプトを終了します。",1,"エラー"
end
}
// (スクリプト上ではhWritePipe、hReadPipeを使った処理を行わないこと)
/* 標準出力をパイプの書き込み側につないでmes.exeを起動 */
cmdline = "mes.exe test.txt"
supInfo = SIZE_SUP_INFO, NULL, NULL, NULL // STARTUPINFO構造体
supInfo(4) = 0, 0, 0, 0
supInfo(8) = 0, 0, NULL, STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES
supInfo(12) = SW_HIDE, NULL, NULL, hWritePipe, NULL
dim procInfo1,4
CreateProcessA NULL,cmdline,0,0,TRUE,NULL,NULL,NULL,varptr(supInfo),varptr(procInfo1)
result = stat
/* パイプの書き込み側ハンドルを閉じる */
CloseHandle hWritePipe
if result=0 {
dialog "mes.exeの起動に失敗しました。スクリプトを終了します。",1,"エラー"
end
}
/* mes.exe関連のハンドルを閉じる */
CloseHandle procInfo1(0)
CloseHandle procInfo1(1)
/* 標準入力をパイプの読み出し側につないでsort.exeを起動 */
cmdline = "sort.exe /o result.txt" // Windowsに付属のコンソール・プログラム
supInfo = SIZE_SUP_INFO,NULL, NULL, NULL // STARTUPINFO構造体
supInfo(4) = 0, 0, 0, 0
supInfo(8) = 0, 0, NULL, STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES
supInfo(12) = SW_HIDE, NULL, hReadPipe,NULL, NULL
dim procInfo2,4
CreateProcessA NULL,cmdline,0,0,TRUE,NULL,NULL,NULL,varptr(supInfo),varptr(procInfo2)
result = stat
/* パイプの読み出し側ハンドルを閉じる */
CloseHandle hReadPipe
if result=0 {
dialog "sort.exeの起動に失敗しました。スクリプトを終了します。",1,"エラー"
end
}
/* sort.exeが終了するまで待つ */
WaitForSingleObject procInfo2(0),INFINITE
/* sort.exe関連のハンドルを閉じる */
CloseHandle procInfo2(0)
CloseHandle procInfo2(1)
/* 処理終了の合図 */
beep
end
|