CBuilder中使用管道技术实例
<P>废话不多说,大家来看代码</P><P>bool __fastcall TForm1::RunCmd(AnsiString cmd,TStringList *stringlist)<BR>{<BR> TMemoryStream *memstream=new TMemoryStream();<BR> AnsiString rn="<a>\\r\\n</A>";<BR> PROCESS_INFORMATION proc;<BR> STARTUPINFO start;<BR> SECURITY_ATTRIBUTES sa;<BR> long ret;<BR> unsigned long lngBytesread;<BR> HANDLE hReadPipe,hWritePipe;<BR> char *strBuff=(char *)malloc(256);<BR> if(strBuff==NULL)<BR> {<BR> return false;<BR> }<BR> sa.nLength = sizeof(SECURITY_ATTRIBUTES);<BR> sa.bInheritHandle=true;<BR> sa.lpSecurityDescriptor=NULL;<BR> ret=CreatePipe(&hReadPipe,&hWritePipe,&sa,0);<BR> if(ret==0)<BR> {<BR> //创建管道失败<BR> return false;<BR> }<BR> memset(&start,0x00,sizeof(STARTUPINFO));<BR> start.cb=sizeof(STARTUPINFO);<BR> start.dwFlags=STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;<BR> start.hStdOutput=hWritePipe;<BR> start.hStdError=hWritePipe;<BR> bool retc=CreateProcess(NULL,cmd.c_str(),NULL,NULL,true, 0, 0, NULL, &start, &proc);<BR> if(!retc)<BR> {<BR> return false;<BR> }<BR> CloseHandle(hWritePipe);<BR> unsigned long len;<BR> memstream->Position=0;<BR> while(true)<BR> {<BR> memset(strBuff,0x00,256);<BR> GetFileSize(hReadPipe,&len);<BR> ret = ReadFile(hReadPipe, strBuff, 256, &lngBytesread,NULL);<BR> if(ret==0)<BR> {<BR> break;<BR> }<BR> else<BR> {<BR> memstream->Write(strBuff,lngBytesread);<BR> }<BR> }<BR> CloseHandle(proc.hProcess);<BR> CloseHandle(proc.hThread);<BR> CloseHandle(hReadPipe);<BR> memstream->Position=0;<BR> free(strBuff);<BR> stringlist->LoadFromStream(memstream);<BR> memstream->Clear();<BR> delete memstream;<BR> return true;<BR>}</P>
<P>以上为一个使用管道获取命令行模式的程序的运行结果的函数。</P>
<P>使用代码</P>
<P>TStringList *StrList=new TStringList;<BR>AnsiString strcmd;</P>
<P>RunCmd(strcmd,StrList);</P>
<P>结果保留再StrList中。<BR></P>
页:
[1]
