![]() |
Createprocess und nicht warten
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 } |
Re: Createprocess und nicht warten
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 |
Re: Createprocess und nicht warten
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. |
Re: Createprocess und nicht warten
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... :gruebel:
|
Re: Createprocess und nicht warten
Mich allerdings auch .. kann ich mir nicht erklären ..
|
Re: Createprocess und nicht warten
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)
|
Re: Createprocess und nicht warten
Zitat:
Zitat:
|
Re: Createprocess und nicht warten
Ich habe es mit verschiedenen Varianten versucht:
Delphi-Quellcode:
Bei den ersten 3 Varianten, bleibt, wie gesagt, mein Programm stehen, bis das DOS-Prog beendet ist. Und ich hab null Ahnung, warum.
//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); |
Re: Createprocess und nicht warten
Wenn ich das Programm so starte, sehe ich immer die Ausgabe von ShowMessage.
Dann kann WinExecAndWait eigentlich nicht hängen.
Delphi-Quellcode:
Grüße
procedure TForm1.Button1Click(Sender: TObject);
begin WinExecAndWait32('notepad',1,false); ShowMessage('123'); end; Klaus |
Re: Createprocess und nicht warten
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.
:witch: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz