Ciekwy kod function ExecuteConsole pomoze ktos?

Odpowiedz Nowy wątek
2007-01-30 14:40
Architekt
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>

Pozostało 580 znaków

2007-01-30 14:46
devfield
0

http://unitedcrew.org/viewtopic.php?t=5288

Pozostało 580 znaków

2007-01-30 15:11
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.


<font color="red">Konto porzucone</span>

Dzięki wszystkim forumowiczom za lata wspólnych dyskusji; miłej zabawy w programowanie!
Sławomir 'Szczawik' Włodkowski

Pozostało 580 znaków

2007-01-30 16:52
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

Pozostało 580 znaków

2007-01-30 17:41
Architekt
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 ?

Pozostało 580 znaków

2007-01-30 18:15
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.


<font color="red">Konto porzucone</span>

Dzięki wszystkim forumowiczom za lata wspólnych dyskusji; miłej zabawy w programowanie!
Sławomir 'Szczawik' Włodkowski

Pozostało 580 znaków

2007-01-30 18:25
Archtekt
0

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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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