Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   DOS Befehle ausführen/rückantworten (https://www.delphipraxis.net/36105-dos-befehle-ausfuehren-rueckantworten.html)

KoRn117 15. Dez 2004 21:19


DOS Befehle ausführen/rückantworten
 
Hi leute!!!

ich habe ein minimini-prog geschrieben, welches einen dos-befehl ausführt.

alles kein prob, doch nun möchte ich von dieser dos-box eine rückmeldung bekommen, dass der befehl ausgeführt wurde blabalbal - ich meine keinen errorcode,oder so...

oder kann man irgendwie den gesamten text aus einer dosbox bekommen?!?


hab gar keinen richtigen ansatz... :roll:

vielen dank

KoRn117

StefanDP 15. Dez 2004 21:28

Re: DOS Befehle ausführen/rückantworten
 
vielleicht hilft es:
mit z.b.
Code:
dir >> datei.txt
kannst du das was normal in der dosbox stehen würde in eine datei ausgeben lassen

Matze 15. Dez 2004 21:28

Re: DOS Befehle ausführen/rückantworten
 
Probier's mal so:

{
Delphi-Quellcode:
procedure TForm1.CaptureDosCmd(command:String; OutputMemo:TMemo);
const
  CaptureBufferSize = 2500;
var
  SecAttrib        : TSecurityAttributes;
  ReadPipe,writePipe: THandle;
  Startup          : TStartUpInfo;
  ProcessInfo      : TProcessInformation;
  CaptureBuffer    : Pchar;
  BytesRead        : DWord;
  WaitHandle       : DWord;

begin
  OutPutMemo.Lines.clear;
  //OutputMemo.lines.add('executing "' + command + '"');
  With SecAttrib do
  begin
    nlength             := SizeOf(TSecurityAttributes);
    binherithandle      := true;
    lpsecuritydescriptor := nil;
  end;

  if Createpipe (ReadPipe, writePipe, @SecAttrib, 0) then
  begin
    CaptureBuffer := AllocMem(CaptureBufferSize + 1);
    FillChar(Startup,Sizeof(Startup),#0);
    Startup.cb         := SizeOf(Startup);
    Startup.hStdOutput := writePipe;
    Startup.hStdInput  := ReadPipe;
    Startup.dwFlags    := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
    Startup.wShowWindow := SW_HIDE;
    if CreateProcess(nil, PChar(command), @SecAttrib, @SecAttrib, true, NORMAL_PRIORITY_CLASS, nil, nil, Startup, ProcessInfo) then
    begin
      repeat
        WaitHandle := WaitForSingleObject( ProcessInfo.hProcess,100);
        Application.ProcessMessages;
      until (WaitHandle <> WAIT_TIMEOUT) or application.terminated;

      if not application.terminated then
      Repeat
        BytesRead := 0;
        ReadFile(ReadPipe,CaptureBuffer[0],CaptureBufferSize,BytesRead,nil);
        CaptureBuffer[BytesRead]:= #0;
        OemToAnsi(CaptureBuffer,CaptureBuffer);
        OutputMemo.Text := OutputMemo.Text+String(CaptureBuffer);
        Application.ProcessMessages;
      until (BytesRead < CaptureBufferSize);
    end
    else OutPutMemo.lines.add('Operation wurde abgebrochen!');

    FreeMem(CaptureBuffer);
    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ReadPipe);
    CloseHandle(writePipe);
  end
  else OutPutMemo.lines.add('Konnte Kommando nicht starten, Fehler: #'+  inttostr(getlasterror));
end;
Falls das noch nicht in der Code-Library ist, und es geht, kann ich's dann reingeben.

NicoDE 15. Dez 2004 21:39

Re: DOS Befehle ausführen/rückantworten
 
Vorab, Matzes Hinweis geht IMHO in die richtige Richtung.
Allerdings gibt's im praktischen Einsatz unter verschiedenen Windows-Versionen diverse Probleme. Bei einem Test-Programm (Konsole-Screenshot im RTF-Format) durfte ich feststellen, dass man nicht mehr als 4K gleichzeitig aus dem Screenbuffer lesen sollte. Ganz davon abgesehen, dass die Ausdehnung des Screenbuffers extreme Ausmaße annehmen können... die Funktion kann also ziemlich komplex werden und die Tests unter den unterstützten Windows-Versionen können reichlich frustrierend werden...

Gruss Nico

KoRn117 15. Dez 2004 21:53

Re: DOS Befehle ausführen/rückantworten
 
der code sieht nicht schlecht aus, nur er funktioniert noch nciht perfekt, aber erstmal danke dafür!!!!!!!!!!!!!!!!!

das hilft mir schon sehr viel weiter

er gibt in das memo allerdings dieses aus:

Zitat:

Unable to get console input mode - 0x80070006
Das Handle ist ungültig.
wie kommt es dazu, dass er das handle nicht bekommt?

KoRn117 15. Dez 2004 21:56

Re: DOS Befehle ausführen/rückantworten
 
das mit den win-versionen ist ja ein mist - bin aber sowieso schon eher negativ an die sache herangegangen, weil ic gerade xp sp2 drauf habe

Garfield 16. Dez 2004 07:11

Re: DOS Befehle ausführen/rückantworten
 
Du kannst ja mal TDosCommand ausprobieren.

Irgendwie scheint es auch Unterschiede bei der Bildschirmausgabe zu geben. Bei manchen Programmen kann man die Ausgabe ganz einfach abfangen, bei anderen kommt nichts außer leeren Strings.

KoRn117 20. Dez 2004 07:57

Re: DOS Befehle ausführen/rückantworten
 
das mit der dos komponente...hat da jemand eine gescheite anleitung zu / was welche befehe machen?

ich hatte die mir schon mal runtergeladen, aber da fehlten einfach einige informationen, wie man die benutzt...


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz