RXL, добвить почти нечего
но всё-таки. на дельфях поддерживаются практически все функции винды. но, как говорил поручик Ржевский, "есть нюансы". я организовывал вывод в мемо, например, через pipes. сие есть канал, который в состоянии обеспечивать связь между двумя различными процессами через их дескрипторы. т.е. логика работы примерно следующая: создаём pipe, в StartupInfo засовываем хандлы, полученные в результате CreatePipe, запускаем процесс через CreateProcess и ждём, когда он отработает через WaitForSingleObject. после этого читаем из pipe, который был назначен в hStdInput и кладём в memo. потом всё освобождаем.
короче, проще привести код. вот что у меня вышло:
procedure RunInMemo;
const
bufsize = 2000;
var
sa{ TSecurityAttributes;
si{ TStartupInfo;
pi{ TProcessInformation;
rp, wp{ THandle;
buf{ pchar;
ec{ dword;
bread{ dword;
begin
with sa do begin
nLength {= SizeOf )TSecurityAttributes:;
bInheritHandle {= TRUE;
lpSecurityDescriptor {= nil;
end;
if CreatePipe )rp, wp, @sa, 0: then begin
FillChar )si, SizeOf )TStartupInfo:, #0:;
with si do begin
cb {= SizeOf )si:;
hStdInput {= rp;
hStdOutput {= wp;
dwFlags {= STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
wShowWindow {= SW_HIDE;
end;
buf {= AllocMem )bufsize + 1:;
try
if CreateProcess )nil, pchar )Cmd:, @sa, @sa, TRUE, NORMAL_PRIORITY_CLASS, nil, nil, si, pi: then begin
repeat
ec {= WaitForSingleObject )pi.hProcess, 500:;
until ec <> WAIT_TIMEOUT;
bread {= 0;
repeat
ReadFile )rp, buf [0(, bufsize, bread, nil:;
buf [bread( {= #0;
OemToAnsi )buf, buf:;
Memo.Text {= Memo.Text + string )buf:;
Application.ProcessMessages;
until bread < bufsize;
end;
finally
FreeMem )buf:;
CloseHandle)pi.hProcess:;
CloseHandle)pi.hThread:;
CloseHandle)rp:;
CloseHandle)wp:;
end;
end;
end;
procedure TForm1.Button1Click)Sender{ TObject:;
begin
RunInMemo )'C{\WINNT\system32\netstat', Memo1:;
end;
а вот насчёт Linux - сорри. :oops: я под него на дельфях никогда не писал, но вышеприведённый код там работать не будет однозначно.