Avatar billede michaelmyers Nybegynder
12. maj 2001 - 18:08 Der er 9 kommentarer og
2 løsninger

Konsol redirection

Jeg kunne godt tænke mig noget kode der kunne kører batchfil skjult og samtidigt sendte outputet til en Win32 app som så viste outputet i en TMemo.

Lidt ala når man compiler i VS C++

TAK !
Avatar billede ziron Nybegynder
13. maj 2001 - 13:30 #1
du brude kunne gøre sådan her:

lav en ny unit og smid dette i eller skriv det ind i din unit...

unit get;

interface

uses
  Controls, Windows, SysUtils, Forms;

function GetDosOutput(const CommandLine:string): string;

implementation

function GetDosOutput(const CommandLine:string): string;
var
  SA: TSecurityAttributes;
  SI: TStartupInfo;
  PI: TProcessInformation;
  StdOutPipeRead, StdOutPipeWrite: THandle;
  WasOK: Boolean;
  Buffer: array[0..255] of Char;
  BytesRead: Cardinal;
  WorkDir, Line: String;
begin
  Application.ProcessMessages;
  with SA do
  begin
    nLength := SizeOf(SA);
    bInheritHandle := True;
    lpSecurityDescriptor := nil;
  end;
  // create pipe for standard output redirection
  CreatePipe(StdOutPipeRead,  // read handle
            StdOutPipeWrite, // write handle
            @SA,            // security attributes
            0                // number of bytes reserved for pipe - 0 default
            );
  try
    // Make child process use StdOutPipeWrite as standard out,
    // and make sure it does not show on screen.
    with SI do
    begin
      FillChar(SI, SizeOf(SI), 0);
      cb := SizeOf(SI);
      dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
      wShowWindow := SW_HIDE;
      hStdInput := GetStdHandle(STD_INPUT_HANDLE); // don\'t redirect std input
      hStdOutput := StdOutPipeWrite;
      hStdError := StdOutPipeWrite;
    end;

    // launch the command line compiler
    WorkDir := ExtractFilePath(CommandLine);
    WasOK := CreateProcess(nil, PChar(CommandLine), nil, nil, True, 0, nil,
PChar(WorkDir), SI, PI);

    // Now that the handle has been inherited, close write to be safe.
    // We don\'t want to read or write to it accidentally.
    CloseHandle(StdOutPipeWrite);
    // if process could be created then handle its output
    if not WasOK then
      raise Exception.Create(\'Could not execute command line!\')
    else
      try
        // get all output until dos app finishes
        Line := \'\';
        repeat
          // read block of characters (might contain carriage returns and line feeds)
          WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil);

          // has anything been read?
          if BytesRead > 0 then
          begin
            // finish buffer to PChar
            Buffer[BytesRead] := #0;
            // combine the buffer with the rest of the last run
            Line := Line + Buffer;
          end;
        until not WasOK or (BytesRead = 0);
        // wait for console app to finish (should be already at this point)
        WaitForSingleObject(PI.hProcess, INFINITE);
      finally
        // Close all remaining handles
        CloseHandle(PI.hThread);
        CloseHandle(PI.hProcess);
      end;
  finally
      result:=Line;
      CloseHandle(StdOutPipeRead);
  end;
end;


end.



og så kalder du den sådan her (his du laver en ny unit så husk at tilføje den i din nuværende).

et fx kald:

memo1.Lines.Add(Get.GetDosOutput(\'c:\\windows\\ping.exe ziron1\'));

det var vist det :-)

/ZIRON
Avatar billede michaelmyers Nybegynder
13. maj 2001 - 17:15 #2
Nu var det sådan at jeg havde prøvet noget lignede kode fra delphi3000.com, men min app fryser når man gør det med batchfiler, så derfor skulle jeg bruge noget andet kode der kunne gøre det.
Avatar billede ziron Nybegynder
13. maj 2001 - 18:12 #3
ja okay kan godt se gør også på min, prøver lige at se...

/ZIRON
Avatar billede ziron Nybegynder
13. maj 2001 - 22:13 #4
jeg har fundet noget andet som vist kan lidt med bat filer, men hvis du har en mail kan jeg jo sende det til dig og så kan du selv prøve at bikse det sammen...
Avatar billede borrisholt Novice
14. maj 2001 - 11:29 #5
ziron >> Som sædvanlig fejler koden ikke noget, men operativ systemet det bliver exekveret på. Hvis du brugte en WIndown NT/2000 ville du opdage koden exekverer i første hug, og laver det ønskede.

Problemet består i at Window 95,98 og Me basalt set STADIG er en masse 16 bits kode der er pakket ind i nogle Mutexs, for at få det virke 32 bits agtigt og for at supotere tråde. Det går med jævne mellemrum galt, bla. i dette tilfælde.

Løsningen er meget simpel : Skift OS !!!!

Jens b http://fotx.net/borrisholt
Avatar billede ziron Nybegynder
14. maj 2001 - 11:43 #6
borrisholt >> okay det viste jeg faktisk ikke, så det vil sige at michael bare må skifte OS :-)

så må vi jo se hvad michael gør???

/ZIRON
Avatar billede michaelmyers Nybegynder
14. maj 2001 - 18:49 #7
>> ziron prøv at sende mig det kode du fandt til shagsmail2@yahoo.dk....
Avatar billede ziron Nybegynder
14. maj 2001 - 19:23 #8
sådan så er den mail på vej...

/ZIRON
Avatar billede ziron Nybegynder
16. maj 2001 - 23:25 #9
har du kunne bruge det til noget`???

/ZIRON
Avatar billede shags Nybegynder
18. maj 2001 - 13:49 #10
Her er løsningen: http://www.eksperten.dk/spm/24729

/Shagger
Avatar billede michaelmyers Nybegynder
19. maj 2001 - 17:20 #11
JOOO.... jeg siger mange tak!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester