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 RunAndWait in For-Schleife (https://www.delphipraxis.net/73327-runandwait-schleife.html)

kabuco 15. Jul 2006 21:58


RunAndWait in For-Schleife
 
Hallo,

habe folgendes Problem zu später Stunde (naja ist ja Wochenende!):

ich habe mir hier im Forum die Prozedur RunAndWaitShell() gefunden und direkt eingebaut, allerdings in eine For-Schleife. Jetzt habe ich das Problem, dass das Programm die erste Datei nicht öffnet und nicht mehr Reagiert.
Gibt es da andere Möglichkeiten, in Schleifen (jeder Art) Programme Aufzurufen und erst dann die Schleife weiterlaufen zu lassen, wenn das Programm beendet wurde?

Gruß kabuco

Bernhard Geyer 15. Jul 2006 22:07

Re: RunAndWait in For-Schleife
 
Du könntest CreateProcess nehmen und warden bis der andere Prozess bereit ist oder wieder beendet.

Christian Seehase 16. Jul 2006 00:18

Re: RunAndWait in For-Schleife
 
Moin Zusammen,

alternativ zu CreateProcess ginge auch ShellExecuteEx.

[EDIT]
Wenn ich mir allerdings anschaue, dass die Funktion RunAndWaitShell heisst, wird sie wohl eine der beiden Funktionen verwenden.

@Kabuco:
Die Funktion wird doch bestimmt einen Rückgabewert haben, oder einen Parameter der das gewünschte macht.

[/EDIT]

kabuco 16. Jul 2006 14:32

Re: RunAndWait in For-Schleife
 
Hallo,

hier die Funktion, die ich verwende:
Delphi-Quellcode:
procedure TForm6.RunAndWaitShell(Executable, Parameter: STRING; ShowParameter: INTEGER);
var
  Info: TShellExecuteInfo;
  pInfo: PShellExecuteInfo;
  exitCode: DWord;
begin
  {Pointer to Info}
  pInfo := @Info;
  {Fill info}
  with Info do
  begin
    cbSize := SizeOf(Info);
    fMask := SEE_MASK_NOCLOSEPROCESS;
    wnd   := application.Handle;
    lpVerb := NIL;
    lpFile := PChar(Executable);
    {Parametros al ejecutable}
    {Executable parameters}
    lpParameters := PChar(Parameter + #0);
    lpDirectory := NIL;
    nShow       := ShowParameter;
    hInstApp    := 0;
  end;
  {Execute}
  ShellExecuteEx(pInfo);

  {Wait to finish}
  repeat
    exitCode := WaitForSingleObject(Info.hProcess, 500);
    Application.ProcessMessages;
  until (exitCode <> WAIT_TIMEOUT);
end;
Wie zu sehen ist, hat die Funktion keinen Rückgabewert. Man könnte aber einen einbauen, nur weiß ich jetzt leider nicht, wo ich den Rückgabewert setzen muss!?

gruß kabuco

Christian Seehase 16. Jul 2006 17:23

Re: RunAndWait in For-Schleife
 
Moin Florian,

da dürfte Dein Programm eigentlich nicht hängen bleiben.
Dass es in der Zeile stehenbleibt wäre normal, da die Funktion erst zurückkehrt, nachdem das externe Programm beendet wurde.
Geh' doch mal im Einzelschritt da durch.

Ggf. kannst Du Dir mal den Rückgabewert von ShellExecuteEx ansehen.
Ist der false, kannst Du Dir mit

Delphi-Quellcode:
ShowMessage(SysErrorMessage(GetLastError));
mal ansehen, was schiefgegangen ist.

kabuco 17. Jul 2006 18:48

Re: RunAndWait in For-Schleife
 
Hallo,

habe mein Problem gelöst indem ich den Prozeduraufruf einfach in eine repeat...until schleife gesteckt habe. Die Schleife wird mit einer Zählervariablen gesteuert. Im Prinzip genau wie in der For-Schleife! Weis auch nicht, warum das jetzt funktioniert. Naja, Hauptsache es funktioniert!

Gruß kabuco


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:16 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 by Thomas Breitkreuz