AGB  ·  Datenschutz  ·  Impressum  







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

Createprocess und nicht warten

Ein Thema von Der Jan · begonnen am 7. Mai 2007 · letzter Beitrag vom 8. Mai 2007
Antwort Antwort
Benutzerbild von Der Jan
Der Jan

Registriert seit: 22. Dez 2005
289 Beiträge
 
Delphi XE7 Ultimate
 
#1

Createprocess und nicht warten

  Alt 7. Mai 2007, 13:06
Hallo,

ich habe ein Problem. Ich möchte aus einem Delphi-Programm ein Dos-Programm starten. Allerdings soll mein Programm nicht warten, tut es aber. Ich habe es zuerst mit der Jedi-Komponente jvCreateProcess versucht und dann mit der Funktion WinExecAndWait_32, die hier im Forum irgendwo vorgestellt wird (ja, ich hab die Suchfunktion benutzt )
Das Problem ist nun, daß mein Programm nach dem Starten des Dos-Programms nicht weiterläuft, sondern wartet, was es aber nicht soll.
Bei jvCreateProcess war WaitForTerminate ausgeschaltet und die Funktion WinExecAndWait_32 hab ich mit WinExecAndWait_32('bla.exe', 1, false) aufgerufen.
Wie kann man das bewerkstelligen? Ist hier CreateProcess vielleicht der falsche Weg?

Achso, der Vollständigkeit halber noch mal die Funktion:
Delphi-Quellcode:
function WinExecAndWait32(FileName: string; Visibility: Integer; bWait: Boolean = False): Longword;
var { by Pat Ritchey } 
  zAppName: array[0..512] of Char;
  zCurDir: array[0..255] of Char;
  WorkDir: string;
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
begin
  StrPCopy(zAppName, FileName);
  GetDir(0, WorkDir);
  StrPCopy(zCurDir, WorkDir);
  FillChar(StartupInfo, SizeOf(StartupInfo), #0);
  StartupInfo.cb := SizeOf(StartupInfo);
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow := Visibility;
  if not CreateProcess(nil,
    zAppName, // pointer to command line string
    nil, // pointer to process security attributes
    nil, // pointer to thread security attributes
    False, // handle inheritance flag
    CREATE_NEW_CONSOLE or // creation flags
    NORMAL_PRIORITY_CLASS,
    nil, //pointer to new environment block
    nil, // pointer to current directory name
    StartupInfo, // pointer to STARTUPINFO
    ProcessInfo) // pointer to PROCESS_INF
    then Result := WAIT_FAILED
  else
  begin
    if bWait then
      WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
    GetExitCodeProcess(ProcessInfo.hProcess, Result);
    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);
  end;
end; { WinExecAndWait32 }
Gruß, Jan
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

Re: Createprocess und nicht warten

  Alt 7. Mai 2007, 13:48
ShellExecute wäre eine Alternative (Unit ShellAPI) Allerdings sehe ich keinen Grund, warum dein Programm auf das Prozessende wartet. WaitForSingleObject wird ja nur dann aufgerufen, wenn bWait true ist ..

//Edit: Oder versuch mal testweise das GetExitCodeProcess auszukommentieren
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von Der Jan
Der Jan

Registriert seit: 22. Dez 2005
289 Beiträge
 
Delphi XE7 Ultimate
 
#3

Re: Createprocess und nicht warten

  Alt 7. Mai 2007, 14:43
Hallo,

danke für die Antwort, leider funzen beide Möglichkeiten nicht. Das DOS-Prog wird gestrtet und mein Programm steht, solange das DOS-Prog läuft. Ich habe alternativ nochmal die Funktion "RunProcess" (von Luckie aus der Code-Lib) probiert, genau das selbe.
Gruß, Jan
  Mit Zitat antworten Zitat
Benutzerbild von Der Jan
Der Jan

Registriert seit: 22. Dez 2005
289 Beiträge
 
Delphi XE7 Ultimate
 
#4

Re: Createprocess und nicht warten

  Alt 7. Mai 2007, 14:50
Ich hatte die Vermutung, daß es vielleicht daran liegt, daß es sich um ein DOS-Programm handelt, habe es deshalb versucht, die notepad.exe zu starten. Selber Effekt... Das verwundert mich stark, ehrlich gesagt...
Gruß, Jan
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

Re: Createprocess und nicht warten

  Alt 7. Mai 2007, 15:01
Mich allerdings auch .. kann ich mir nicht erklären ..
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Createprocess und nicht warten

  Alt 7. Mai 2007, 15:14
Bei CreateProcess und ShellExecute wird definitiv nur gewartet bis das programm gestartet wurde (zwecks Fehlercode und ProcessID). Irgendwas scheinst du beim aufruf falsch zu machen (daher bringt es nichts und die Funktionen zu posten die du aufrufst sondern solltest eher posten wie du diese Funktionen aufrufst)
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: Createprocess und nicht warten

  Alt 7. Mai 2007, 15:43
Zitat von SirThornberry:
...sondern solltest eher posten wie du diese Funktionen aufrufst)
Zitat von Der Jan:
... hab ich mit WinExecAndWait_32('bla.exe', 1, false) aufgerufen....
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Der Jan
Der Jan

Registriert seit: 22. Dez 2005
289 Beiträge
 
Delphi XE7 Ultimate
 
#8

Re: Createprocess und nicht warten

  Alt 7. Mai 2007, 15:50
Ich habe es mit verschiedenen Varianten versucht:

Delphi-Quellcode:
//pdx ist das Dos-Prog und der Parameter steht in g_sName
ShellExecute(0, 'open', 'pdx', PChar(g_sName), NIL, SW_SHOW);

//oder mit Luckies Funktion aus der Code-Lib:
var
  ProcID: cardinal;
RunProcess('pdx ' + g_sName}, SW_SHOW, false, @ProcID)

//oder eben so:
WinExecAndWait_32('pdx ' + g_sName, 1, false);

//hab auch dies mal versucht, da kommen wilde Fehlermeldungen (Access Violation etc.):
ShellExecute(0, 'open', 'cmd.exe', PChar('/C "pdx ' + g_sName + '"'), NIL, SW_SHOW);
Bei den ersten 3 Varianten, bleibt, wie gesagt, mein Programm stehen, bis das DOS-Prog beendet ist. Und ich hab null Ahnung, warum.
Gruß, Jan
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: Createprocess und nicht warten

  Alt 7. Mai 2007, 15:56
Wenn ich das Programm so starte, sehe ich immer die Ausgabe von ShowMessage.
Dann kann WinExecAndWait eigentlich nicht hängen.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  WinExecAndWait32('notepad',1,false);
  ShowMessage('123');
end;
Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Der Jan
Der Jan

Registriert seit: 22. Dez 2005
289 Beiträge
 
Delphi XE7 Ultimate
 
#10

Re: Createprocess und nicht warten

  Alt 8. Mai 2007, 10:41
Ich vermute, aber verstehe immer noch nicht, warum dies so ist, das es an der Delphi-IDE lag. Habe ich mein Programm ohne Debug-Kram kompiliert und von außerhalb der IDE gestartet ging es letztendlich.
Gruß, Jan
  Mit Zitat antworten Zitat
Antwort Antwort


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 19:12 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