展开全部
[Delphi函数]把DOS程序的结果显示在MEMO中 procedure RunDosInMemo(Que:String;EnMemo:TMemo); const CUANTOBUFFER = 2000; var Seguridades : TSecurityAttributes; PaLeer,PaEscribir : THandle; start : TStartUpInfo; ProcessInfo : TProcessInformation; Buffer : Pchar; BytesRead : DWord; CuandoSale : DWord; begin with Seguridades do begin nlength := SizeOf(TSecurityAttributes); binherithandle := true; lpsecuritydescriptor := nil; end; {Creamos el pipe...} if Createpipe (PaLeer, PaEscribir, @Seguridades, 0) then begin Buffer := AllocMem(CUANTOBUFFER + 1); FillChar(Start,Sizeof(Start),#0); start.cb := SizeOf(start); start.hStdOutput := PaEscribir; start.hStdInput := PaLeer; start.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW; start.wShowWindow := SW_HIDE; if CreateProcess(nil, PChar(Que), @Seguridades, @Seguridades, true, NORMAL_PRIORITY_CLASS, nil, nil, start, ProcessInfo) then begin {Espera a que termine la ejecucion} repeat CuandoSale := WaitForSingleObject( ProcessInfo.hProcess,100); Application.ProcessMessages; until (CuandoSale <> WAIT_TIMEOUT); {Leemos la Pipe} repeat BytesRead := 0; {Llenamos un troncho de la pipe, igual a nuestro buffer} ReadFile(PaLeer,Buffer[0],CUANTOBUFFER,BytesRead,nil); {La convertimos en una string terminada en cero} Buffer[BytesRead]:= #0; {Convertimos caracteres DOS a ANSI} OemToAnsi(Buffer,Buffer); EnMemo.Text := EnMemo.text + String(Buffer); until (BytesRead < CUANTOBUFFER); end; FreeMem(Buffer); CloseHandle(ProcessInfo.hProcess); CloseHandle(ProcessInfo.hThread); CloseHandle(PaLeer); CloseHandle(PaEscribir); end; end; Usage: RunDosInMemo('net user hysia /add',Memo1);
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询