 
//这个结构体在创建管道时会用到
SECURITY_ATTRIBUTES = class{ 
    INT nLength;
    pointer lpSecurityDescriptor;
    bool bInheritHandle;
}
saPipe =SECURITY_ATTRIBUTES();
saPipe.bInheritHandle = true;
CreatePipe = ::Kernel32.api( "CreatePipe", "bool(pointer& hRead,pointer& hWrite,struct attributes,INT size)");
ok,outPipeRead,outPipeWrite = CreatePipe(,,saPipe,0)
ok,errPipeRead,errPipeWrite = CreatePipe(,,saPipe,0)

import process
import fsys.file;
 
//启动进程时,可以使用STARTUPINFO()结构体指定一些高级参数,
//当然这个参数不是必须的,而且这个结构体里的所有参数都设定了默认值,所有字段都是可选的
//甚至你用一个普通的table也可以,process构造函数会自动转换为结构体
startInfo = process.STARTUPINFO()
startInfo.flags =  0x100/*_STARTF_USESTDHANDLES*/ | 0x1/*_STARTF_USESHOWWINDOW*/
//要在上面的sa.flag中指定_STARTF_USESHOWWINDOW下面这个参数才有作用哦
//下面隐藏窗口,因为0是默认值,所以这句可以省略
startInfo.showWindow = 0x0/*_SW_HIDE*/  
//我们在下面设置启动进程的管道,也就是控制台程序的输入输出了
//注意要在 startInfo.flags 中指定 _STARTF_USESTDHANDLES 下面的参数才起作用
startInfo.stdInput = _INVALID_HANDLE_VALUE
startInfo.stdOutput =  process.dup( outPipeWrite )
startInfo.stdError =  process.dup( errPipeWrite )
startInfo.creationFlag = 0x8/*_DETACHED_PROCESS*/  //禁止子进程附加到当前进程的控制台
startInfo.inheritHandles = true; //允许子进程继承句柄
// startInfo.suspended = true; //这个参数也很有用,如果为真,创建的进程会处于等待状态并不运行

//下面我们创建进程
var prcs = process( ,"ping www.baidu.com" , startInfo);
//你也可以有其他的写法,总之很自由 var prcs = process( "ping","www.baidu.com" , { suspended = true } );
 
//子继承已经继承了此句柄,我们可以关掉了
//这样ping.exe一关掉,fileCon.read()就会失败停止,不然他就卡在那里一直读,因为管道没关闭吗
raw.closehandle(startInfo.stdOutput)
raw.closehandle(startInfo.stdError)

//我们现在来创建一个文件对象,用来读取控制台程序的输出
//fsys.file这个对象比较有意思,可以直接打开管道的句柄,创建一个文件对象.
//fileCon = fsys.file(outPipeRead)

fileCon = io.open(outPipeRead)

//我们打开控制台
io.open()

//读取一行
line = fileCon.read();
while(line){
	io.print( line )
	line =  fileCon.read();
}

io.print( "ping.exe是隐藏的,你现在看到的是我们自已的控制台哦
你看到的信息也是通过管道读取的"  )
 

execute("pause") //按任意键继续
io.close();//关闭控制台
