Knast Skrevet 24. februar 2005 Skrevet 24. februar 2005 Kan man flette inn windows console linjer i delphi-programmer? ex: man fyller inn et datamaskin navn i en edit box, haker av på en radioknapp som heter net send, skriver beskjeden i en annen editbox eller richedit og trykker på en knapp (send)... Denne prosessen skal sende console kommandoen "net send <datamaskinnavn> <beskjed>".. eller hake av på radiobutton ping og kommandoen blir: "ping <datamaskinnavn>"... må man legge inn et komponent på toppen der unit1, buttons, edits osv. står inn? mer? er nybegynner så trenger å vite alle prosesser.. vet ikke om det er noe (som er selfølgelig for dere som har holdt på en stund) jeg må legge inn... på forhånd takk,.
Format71 Skrevet 25. februar 2005 Skrevet 25. februar 2005 Denne vil kanskje få deg et stykke på veg? Capture the output from a DOS (command/console) Window -Vegar
john_h Skrevet 25. februar 2005 Skrevet 25. februar 2005 Tror heller ShellExecute er det han mener.. Dropp to Radiobuttons, en Button og to Edits på en form. Legg til ShellAPI i uses-lista. RadioButton1 er netsend, og RadioButton2 er ping; Edit1 er navnet til maskina (evt. IP skal vel også fungere, om jeg ikke tar feil), og Edit2 er evt. beskjed som skal sendes med netsend. Dobbeltklikk på Button1 og bytt ut den genererte koden med denne: procedure TForm1.Button1Click(Sender: TObject); begin if RadioButton1.Checked then ShellExecute(Handle, PChar('open'), PChar('net'), PChar('send ' + Edit1.Text + ' ' + Edit1.Text), nil, SW_SHOWNORMAL) else if RadioButton2.Checked then ShellExecute(Handle, PChar('open'), PChar('ping'), PChar(Edit1.Text), nil, SW_SHOWNORMAL) else ShowMessage('Velg enten ''Ping'' eller ''Netsend'''); end;
Knast Skrevet 28. februar 2005 Forfatter Skrevet 28. februar 2005 Tusen takk for hjelpen... Er på jobb nå.. skal teste de når jeg kommer hjem:D
Format71 Skrevet 28. februar 2005 Skrevet 28. februar 2005 Trodde han ønske å ha resultatet av kommandoen inn i programmet i stede for i et nytt konsollvindu.... Men hvorfor gjøre det vanskelig ;-)
Knast Skrevet 28. februar 2005 Forfatter Skrevet 28. februar 2005 Trodde han ønske å ha resultatet av kommandoen inn i programmet i stede for i et nytt konsollvindu.... Men hvorfor gjøre det vanskelig ;-) det er det jeg vil.. er som sagt noob og kan ikke vite det... men format; står det på den linken du sendte hvordan man får svaret tilbake i programmet?
Format71 Skrevet 1. mars 2005 Skrevet 1. mars 2005 Ja det gjør det. Dersom du kopierer hele RunDosInMemo( )-prosedyren fra eksemplet skal du kunne bruke den direkte. Den tar to parametere, en med kommandoen du ønsker å kjøre (f.eks. 'ping www.hardware.no') og en med memoboksen outputen skal legges i. Har du det på plass skulle det være greit å endre slik at output'en blir lagt i en TStringList i stede slik at du kan parse den og vise ting akkurat slik du ønsker det. -Vegar
Knast Skrevet 1. mars 2005 Forfatter Skrevet 1. mars 2005 Ja det gjør det. Dersom du kopierer hele RunDosInMemo( )-prosedyren fra eksemplet skal du kunne bruke den direkte. Den tar to parametere, en med kommandoen du ønsker å kjøre (f.eks. 'ping www.hardware.no') og en med memoboksen outputen skal legges i. Har du det på plass skulle det være greit å endre slik at output'en blir lagt i en TStringList i stede slik at du kan parse den og vise ting akkurat slik du ønsker det. -Vegar beklager at jeg ikke er så stø i delphi, men kan du legge inn reply med koden jeg skal legge inn? f.eks jeg mottar en net send og skal få den til å gå rett inn i programmet mitt.. eks. jeg mottar en net send fra 'random'. beskjeden er 'hei'. hvordan går dette rett inn i programmet? eller vil jeg uansett få en windows popup beskjed med meldingen?? eller om jeg kjører en ping kommando fra programmet og vil ha svaret tilbake i en label i programmet mitt i stedet for et nytt ledetekst-vindu.-.. klarer du dette? på forhånd takk..
Format71 Skrevet 2. mars 2005 Skrevet 2. mars 2005 (endret) Lag en form med en editboks, en knapp og ett memofelt. Koble Button1Click( ) til onClick-eventet på knappen. Så kan du skrive inn hosten i editfeltet, f.eks. www.hardware.no og trykke på knappen. Output skal da komme til memoen. procedure RunDosInMemo(DosApp:String;AMemo:TMemo); const ReadBuffer = 2400; var Security : TSecurityAttributes; ReadPipe,WritePipe : THandle; start : TStartUpInfo; ProcessInfo : TProcessInformation; Buffer : Pchar; BytesRead : DWord; Apprunning : DWord; begin With Security do begin nlength := SizeOf(TSecurityAttributes); binherithandle := true; lpsecuritydescriptor := nil; end; if Createpipe (ReadPipe, WritePipe, @Security, 0) then begin Buffer := AllocMem(ReadBuffer + 1); FillChar(Start,Sizeof(Start),#0); start.cb := SizeOf(start); start.hStdOutput := WritePipe; start.hStdInput := ReadPipe; start.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW; start.wShowWindow := SW_HIDE; if CreateProcess(nil, PChar(DosApp), @Security, @Security, true, NORMAL_PRIORITY_CLASS, nil, nil, start, ProcessInfo) then begin repeat Apprunning := WaitForSingleObject(ProcessInfo.hProcess,100); Application.ProcessMessages; until (Apprunning <> WAIT_TIMEOUT); Repeat BytesRead := 0; ReadFile(ReadPipe,Buffer[0], ReadBuffer,BytesRead,nil); Buffer[BytesRead]:= #0; OemToAnsi(Buffer,Buffer); AMemo.Text := AMemo.text + String(Buffer); until (BytesRead < ReadBuffer); end; FreeMem(Buffer); CloseHandle(ProcessInfo.hProcess); CloseHandle(ProcessInfo.hThread); CloseHandle(ReadPipe); CloseHandle(WritePipe); end; end; procedure TForm1.Button1Click(Sender: TObject); begin RunDosInMemo('ping ' + edit1.text, memo1); end; Motta net send kan du ikke på denne måten. Det sier seg selv da det ikke er noen dosboks involvert i mottak av nettsend. Det skal imidlertid være mulig å snappe opp disse meldingene også på et vis. F.eks. gjør QuickMessanger dette. Hvordan vet jeg ikke. Mulig den snapper all netttrafikk på en gitt port eller noe. -Vegar Endret 2. mars 2005 av Format71
Knast Skrevet 4. mars 2005 Forfatter Skrevet 4. mars 2005 den virket ikke... må jeg adde noe i uses, procedure el noe sånt? i så fall hva? undeclared på rundosinmemo..
john_h Skrevet 4. mars 2005 Skrevet 4. mars 2005 Legg til "procedure RunDosInMemo(DosApp:String;AMemo:TMemo);" under private declarations i unit'en.
Knast Skrevet 4. mars 2005 Forfatter Skrevet 4. mars 2005 Legg til "procedure RunDosInMemo(DosApp:String;AMemo:TMemo);" under private declarations i unit'en. Feilmelding: unsatisfied forward or external declaration 'TForm1.Runindosmemo' og rødt over den jeg puttet inn til private declerations...
john_h Skrevet 4. mars 2005 Skrevet 4. mars 2005 Endre den øverste linja i procedure'n (RunDosInMemo) til: procedure TForm1.RunDosInMemo(DosApp:String;AMemo:TMemo);
Knast Skrevet 4. mars 2005 Forfatter Skrevet 4. mars 2005 sorry at jeg forstår dette (ekstremt) tregt.. kan noen gi meg det med teskje? hva skal stå i uses, procedures øverst i unit-fila, private og public delclerations, (hele) koden til memo'en fra "procedure" til "end"; noe mer? takk
Maranai Skrevet 5. mars 2005 Skrevet 5. mars 2005 FORMAT OG JOHN, dere begge suger så heftig. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure RunDosInMemo(DosApp:String;AMemo:TMemo); const ReadBuffer = 2400; var Security : TSecurityAttributes; ReadPipe,WritePipe : THandle; start : TStartUpInfo; ProcessInfo : TProcessInformation; Buffer : Pchar; BytesRead : DWord; Apprunning : DWord; begin With Security do begin nlength := SizeOf(TSecurityAttributes); binherithandle := true; lpsecuritydescriptor := nil; end; if Createpipe (ReadPipe, WritePipe, @Security, 0) then begin Buffer := AllocMem(ReadBuffer + 1); FillChar(Start,Sizeof(Start),#0); start.cb := SizeOf(start); start.hStdOutput := WritePipe; start.hStdInput := ReadPipe; start.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW; start.wShowWindow := SW_HIDE; if CreateProcess(nil, PChar(DosApp), @Security, @Security, true, NORMAL_PRIORITY_CLASS, nil, nil, start, ProcessInfo) then begin repeat Apprunning := WaitForSingleObject (ProcessInfo.hProcess,100); Application.ProcessMessages; until (Apprunning <> WAIT_TIMEOUT); Repeat BytesRead := 0; ReadFile(ReadPipe,Buffer[0], ReadBuffer,BytesRead,nil); Buffer[BytesRead]:= #0; OemToAnsi(Buffer,Buffer); AMemo.Text := AMemo.text + String(Buffer); until (BytesRead < ReadBuffer); end; FreeMem(Buffer); CloseHandle(ProcessInfo.hProcess); CloseHandle(ProcessInfo.hThread); CloseHandle(ReadPipe); CloseHandle(WritePipe); end; end; procedure TForm1.Button1Click(Sender: TObject); begin RunDosInMemo('ping www.goat.cx ',Memo1); end; end.
Format71 Skrevet 7. mars 2005 Skrevet 7. mars 2005 FORMAT OG JOHN, dere begge suger så heftig. Det der er bare skryt! Du, og alle andre, vet utmerket godt at verken john_h eller jeg ville ha sugd deg for en million! -Vegar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå