Gå til innhold

bruke windows console i et program


Anbefalte innlegg

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,.

Lenke til kommentar
Videoannonse
Annonse

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;

Lenke til kommentar
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?

Lenke til kommentar

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

Lenke til kommentar
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..

Lenke til kommentar

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 av Format71
Lenke til kommentar

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.

Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...