Ciekwy kod function ExecuteConsole pomoze ktos?

0

Mam oto taki ciekawy kod funkcja wywoluje cmd z parametrem zadanym w edit1 i w folderze c:\ tylko tyle wiem i prosze was jesli byscie mogli mi go nieco wytlumaczyc bo naprawde ciekawie wyglada lub dajcie jakiegos linka o podobnej tematyce [browar]

function ExecuteConsole(Executable:PChar; CommandLine:PChar; Directory:PChar):boolean; 
const bufSize = 256; 
var readPipe :THandle; 
writePipe :THandle; 
security :SECURITY_ATTRIBUTES; 
info :STARTUPINFO; 
process :PROCESS_INFORMATION; 

buf :array[0..bufSize-1] of char; 
bytesRead :DWord; 
text :string; 
line :string; 
newLinePos :integer; 
begin 
result:=FALSE; 
security.nLength:=sizeof(security); 
security.lpSecurityDescriptor:=nil; 
security.bInheritHandle:=TRUE; 
Application.ProcessMessages; 
if CreatePipe(readPipe, writePipe, @security, 0) then 
begin 
ZeroMemory(@info, sizeof(info)); 
with info do 
begin 
cb := sizeof( info ); 
dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; 
wShowWindow := SW_HIDE; 
hStdInput := 0; 
hStdOutput := writePipe; 
hStdError := writePipe; 
end; 
if CreateProcess(Executable, CommandLine, nil, nil, TRUE, 0, nil, Directory, info, process) then 
begin 
CloseHandle( writePipe ); 
text:=''; 
while ReadFile( readPipe, buf, bufSize, bytesRead, nil) do 
begin 
text:=text+buf; 
repeat 
newLinePos:=Pos(#13, text); 
if (newLinePos=0) then break; 
line:=copy(text,1, newLinePos-1); 
delete(text, 1, newLinePos); 
Form1.Memo1.Lines.Add(line); 
Application.ProcessMessages; 
until Application.Terminated; 
ZeroMemory(@buf, bufSize); 
end; 
result:=TRUE; 
end; 
CloseHandle( readPipe ); 
end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
ExecuteConsole('c:\WINDOWS\system32\cmd.exe', PChar('/C "'+Edit1.Text+'"'), 'c:\'); 
Edit1.Text:=''; 
end;
</delphi>
0

Ciekawy, bo mojego autorstwa. Na forum jest w kilku tematach, z resztą napisałem go dla jakiegoś forumowicza.

Co tu opisać? Tworzysz proces, jako jego strumień wyjściowy dajesz potok nienazwany, wejściowy zamykasz, bo nie potrzebujesz nic podawać i odczytujesz potok tak długo, jak da się cokolwiek odczytać i aplikacja działa. Nic innego.

0

A znasz moze jakies linki do artykulow opisujacych conieco z tego ? O potokach juz zaczalem szukac ;-) Bo pierwszy raz sie z czyms takim stykam wiec ok 80% tego kodu jest dla mnie conajmniej malo zrozumiale

0

Tak jak powyzej jesli bys mogl dac komentarze do swojej funkcji lub jakies zrodla gdzie moge conieco na ten temat poczytac albo gg [???] Nie wiem skad sa te atrybuty security itp. co one oznaczaja ? Bo o potokach juz conieco poczytalem wiem ze trzeba np u rodzica zamknac wejscie zeby wysalc do potomka wyjsciem a u potomka zamknac wyjscie zeby moc odebrac ale jeszcze zamalo masz moze jakies materialy ?

0

W tych dwóch linkach jest wszystko:
CreatePipe
CreateProcess

Strumień potoku domyślnie jest dwukierunkowy. Ustawiam Security, aby potok mógł być odziedziczony (domyślnie nie jest) przez wywołany proces (dzięki temu mogę zamknąć koniec WritePipe, ale nowy proces ma go wciąż otwartego). Aplikacja ta podczas wykonania przesyła dane do strumienia wyjściowego, gdzie podpięty jest potok WritePipe, a tutaj odczytuję z drugiego końca, czyli przez ReadPipe.

0

Merci merci swietne :-) :-) :-) :-) :-) :-) :-) [browar]

1 użytkowników online, w tym zalogowanych: 0, gości: 1