AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dos-Programm öffnen

Ein Thema von Alexander · begonnen am 16. Jan 2003 · letzter Beitrag vom 18. Jan 2003
Antwort Antwort
Seite 1 von 2  1 2      
Alexander

Registriert seit: 28. Aug 2002
Ort: Oldenburg
3.513 Beiträge
 
Turbo Delphi für .NET
 
#1

Dos-Programm öffnen

  Alt 16. Jan 2003, 16:32
Ich will ein Dosprogramm mit Parametern öffnen. es ist schon etwas länger her, dass ich damit angefangen (habe noch mit anderen Projekten angefangen)
Naja aufjeden Fall liegt das Programm, was ich öffnen will, im Verzeichnis tools im Hauptprogrammverzeichnis, in dem auch meine Anwendung liegt.
Das Problem ist folgendes, dass das Dos-Programm nicht das macht was es eigentlich soll, und auch tut wenn ich es normal starte (also ohne meine Anwendung)
Delphi-Quellcode:
function OpenProgram(prog, params: string):Boolean;
var
  c, p: array[0..800] of Char;
begin
  StrPCopy(c, prog);
  StrPCopy(p, params);
  ShellExecute(Application.Handle, 'open', c, p, nil, SW_NORMAL);
end;
hiermit rufe ich es auf
 OpenProgram(ExtractFilePath(ParamSTr(0))+'tools/tidy', ' -f err.msg'+'- datei.html'); Die datei err.msg soll erstellt werden und aus der datei.html soll gelesen werden.
Das DOS-Fenster öffnet sich und schließt sofort wieder, die Datei err.msg wird aber nicht erstellt
Alexander
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#2
  Alt 16. Jan 2003, 16:36
Also, ich würde die Parameter so ändern:
OpenProgram(ExtractFilePath(ParamSTr(0))+'tools/tidy.com', '-f err.msg'+' -datei.html'); <hris (sieht doch auch nicht schlecht aus... )
  Mit Zitat antworten Zitat
Alexander

Registriert seit: 28. Aug 2002
Ort: Oldenburg
3.513 Beiträge
 
Turbo Delphi für .NET
 
#3
  Alt 16. Jan 2003, 16:47
daran liegt es nicht, man kann den relativen und den absoluten Pfad nutzen (dachte ich auch erst....)
Also er muss ja die *.exe finden, denn sonst würde er ja kein DOS-Fenster öffnen. Nur irgendwie stimmt da was nicht. Die gleichen Parameter so in ein Dos-Fenster eingegeben -> funktioniert, per Programm nicht.
Alexander
  Mit Zitat antworten Zitat
Alexander

Registriert seit: 28. Aug 2002
Ort: Oldenburg
3.513 Beiträge
 
Turbo Delphi für .NET
 
#4
  Alt 16. Jan 2003, 16:51
Verdammt ich weiß jetzt woran es lag.....

Hat schon immer alles funktioniert. Nur hat er die err.msg komischerweise nach c:\windows\ gespeichert. Das Verhalten war beim normalen Ausführen anders.....
Alexander
  Mit Zitat antworten Zitat
Gast
(Gast)

n/a Beiträge
 
#5
  Alt 16. Jan 2003, 17:10
Schnell mal zum Thema, willst du den dos text auslesen, nicht nur ausführen, dass du siehst, das er erfolgreich ausgeführt wurde.
  Mit Zitat antworten Zitat
Alexander

Registriert seit: 28. Aug 2002
Ort: Oldenburg
3.513 Beiträge
 
Turbo Delphi für .NET
 
#6
  Alt 16. Jan 2003, 17:52
Könnte mir jemand helfen?
Und den obigen Quellcode etwas abändern?
Also ich will das mein Programm irgendeine Nachricht ausgibt wenn sich das Programm wieder beendet hat. Wie mache ich das?
Alexander
  Mit Zitat antworten Zitat
Benutzerbild von RomanK
RomanK

Registriert seit: 7. Jun 2002
Ort: Kirchheim unter Teck
1.036 Beiträge
 
Delphi 7 Personal
 
#7
  Alt 16. Jan 2003, 17:55
Vielleicht hilft dass:
http://www.delphipraxis.net/viewtopi...=createprocess
Roman Keller
Krieg ist Gottes Art den Amerikanern Geographie beizubringen!
  Mit Zitat antworten Zitat
Gast
(Gast)

n/a Beiträge
 
#8
  Alt 16. Jan 2003, 19:16
Willst du eine Nachricht empfange vom Dos, oder nur eine bestätigung ob das programm beendet wurde, ich kann dir geben, das du das im tmemo stehen hast, was im dos steht.

Das ist eigendlich ganz einfach:

Delphi-Quellcode:
procedure CaptureDos(command:String;Stringsp:TStrings);
const
  CaptureBufferSize = 2500;
var
  SecAttrib : TSecurityAttributes;
  ReadPipe,writePipe : THandle;
  Startup : TStartUpInfo;
  ProcessInfo : TProcessInformation;
  CaptureBuffer : Pchar;
  BytesRead : DWord;
  WaitHandle : DWord;
begin
  Stringsp.clear;
 Stringsp.add('Starte "'+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_SHOW;

    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);
        Stringsp.Text := Stringsp.Text+String(CaptureBuffer);
      until (BytesRead < CaptureBufferSize);
      end else Stringsp.add('Fehler!');
    FreeMem(CaptureBuffer);
    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ReadPipe);
    CloseHandle(writePipe);
  end else Stringsp.add('Konnte Dos Kommando nicht starten, Fehler: #'+
  inttostr(getlasterror));
end;
Um die prozedur auszuführen, benutzt du z.B.
procedure CaptureDos('dir c:',Memo1->Lines);

dann bekommste dein dos komando.

[keine garantie, habe ich aus c++ übersetzt...]

Falls ein fehler auftreten sollte, bitte melden!
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#9
  Alt 16. Jan 2003, 19:49
Sieht richtig aus, aber Aufruf nicht mit CaptureDos('dir c:',Memo1->Lines) sondern mit CaptureDos('dir C:\',Memo1.Lines);

Chris
  Mit Zitat antworten Zitat
Alexander

Registriert seit: 28. Aug 2002
Ort: Oldenburg
3.513 Beiträge
 
Turbo Delphi für .NET
 
#10
  Alt 16. Jan 2003, 19:56
die Funktion von MAtthias sollte mich weiterbringen. (Link von FuckRacism)
@Tillmann David: ICh wollte nur abwarten bis das Prog beendet ist. Deine Funktion könnte man ja auch relativ leicht umarbeiten, zu dem was ich brauch
Also Danke an alle
Alexander
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:55 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