Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Createprocess und nicht warten (https://www.delphipraxis.net/91582-createprocess-und-nicht-warten.html)

Der Jan 7. Mai 2007 12:06


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 }

Zacherl 7. Mai 2007 12:48

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

Der Jan 7. Mai 2007 13:43

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.

Der Jan 7. Mai 2007 13:50

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:

Zacherl 7. Mai 2007 14:01

Re: Createprocess und nicht warten
 
Mich allerdings auch .. kann ich mir nicht erklären ..

SirThornberry 7. Mai 2007 14:14

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)

alzaimar 7. Mai 2007 14:43

Re: Createprocess und nicht warten
 
Zitat:

Zitat von SirThornberry
...sondern solltest eher posten wie du diese Funktionen aufrufst)

Zitat:

Zitat von Der Jan
... hab ich mit WinExecAndWait_32('bla.exe', 1, false) aufgerufen....

:zwinker:

Der Jan 7. Mai 2007 14:50

Re: Createprocess und nicht warten
 
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.

Klaus01 7. Mai 2007 14:56

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:
procedure TForm1.Button1Click(Sender: TObject);
begin
  WinExecAndWait32('notepad',1,false);
  ShowMessage('123');
end;
Grüße
Klaus

Der Jan 8. Mai 2007 09:41

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 20:07 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