Entwickler-Ecke

Windows API - CreateProcess und "start /wait"


Aya - Do 10.09.09 15:51
Titel: CreateProcess und "start /wait"
Hi,

ich muß ein programm via Command line starten, der aufruf dafür sieht so aus:

start "theProgram" /wait c:\theProgram\theProgram.exe -s -t

es muß leider zwingend via start mit /wait aufgerufen werden, wenn ich es nur so aufrufe:

c:\theProgram\theProgram.exe -s -t

komme ich sofort wieder in die commando zeile zurück, obwohl das programm noch arbeitet.. bei start /wait komme ich erst dann wieder zurück wenn das Programm wirklich fertig ist.

So, das problem ist jetzt.. im moment starte ich das einfach via System("start ...");
Das klappt auch, aber ich möchte gern das Fenster welches aufgeht von dem fremden programm verstecken.. aber das geht bei System() nicht.


Hat irgendwer eine idee wie ichdas mit ShellExecute oder CreateProcess hinbekomme?

Aya~


platzwart - Do 10.09.09 15:58


Delphi-Quelltext
1:
RunConsoleApp("start "theProgram" /wait c:\theProgram\theProgram.exe -s -t");                    


Aya - Do 10.09.09 16:02

user profile iconplatzwart hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
RunConsoleApp("start "theProgram" /wait c:\theProgram\theProgram.exe -s -t");                    


Öhm.... mal davon abgesehen das ich zu dem befehl nichts finde bei google, wo soll ich da das erreichen können das das Fenster nicht angezeigt wird? Etwas á la SW_HIDE sehe ich da nicht.

Aya

PS: Ich nutze btw C++, nicht Delphi.


thepaine91 - Do 10.09.09 16:06

theprogram.exe -s -t nennt sich sicher auch shutdown.exe o. ? ^^


Aya - Do 10.09.09 16:11

user profile iconthepaine91 hat folgendes geschrieben Zum zitierten Posting springen:
theprogram.exe -s -t nennt sich sicher auch shutdown.exe o. ? ^^

Ja, unbedingt..

Wenn du es genau wissen willst:

Quelltext
1:
start "neatimage" /wait C:\Programme\NeatImage\NeatImage.exe input.tif output.tif -ap -sl                    


:roll:


platzwart - Do 10.09.09 16:13

Sorry, war für Delphi und läuft im Hintergrund...


Delete - Do 10.09.09 22:17

user profile iconthepaine91 hat folgendes geschrieben Zum zitierten Posting springen:
theprogram.exe -s -t nennt sich sicher auch shutdown.exe o. ? ^^

Das ist Aya, und der ist bestimmt kein Scriptkiddy.


thepaine91 - Fr 11.09.09 08:59

Luckie hab ich mit keinem Wort gesagt wenn das so rüber kam sorry Aya.

Durch dein Beispiel sah es nur einfach danach aus. :oops:


jaenicke - Fr 11.09.09 09:36

start /wait macht doch vermutlich nicht viel anderes als diese Quelltexte:
http://www.delphi-library.de/viewtopic.php?p=470058
http://www.delphipraxis.net/post722533.html#722533
Ich vermute, dass du dann das damit ganz normal aufrufen kannst, oder?


Lossy eX - Fr 11.09.09 10:03

Also eines finde ich etwas verwirrend. Hast du da jetzt so was wie eine Batch oder ist das Bestandteil eines Programmes von dir?

Wenn du das aus deinem Programm herraus startest, dann kannst du CreateProcess benutzen und die Anwendung direkt starten. Ohne Umweg über Start. Zum Warten musst du dann nur das ProcessHandle an WaitForObject übergeben. Dann hättest du auch noch die Möglichkeit, dass deine Anwendung nach wie vor noch erreichbar bliebe. Bzw dass du im Falle des Falles die andere Anwendung dann noch abschießen könntest.

Außerdem könntest du mit CreateProcess einen ShowMode angeben. An CreateProcess muss ein StartupInfo übergeben werden. In diesem Info gibt es ein Feld wShowWindow. Dieses enthält einen ShowMode. Der wird aber nur benutzt, wenn STARTF_USESHOWWINDOW in dwFlags enthalten ist. ABER. Ob das jetzt die Lösung aller Probleme ist, lasse ich mal dahingestellt. Denn das sorgt nur dafür dass der erste Aufruf von ShowWindow ignoriert wird und anstelle dessen der übergebene Modus benutzt wird. Ein mehrfaches Aufrufen oder ein zweit oder drittfenster würden nicht beeinflusst werden. Calc ignoriert zum Beispiel das ShowWindow wärend notepad (u. ++) das nicht tut.

Hier mal ein Beispiel. Und ja ich weiß, dass das pascal ist.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
var
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
begin
  FillChar(StartupInfo, SizeOf(StartupInfo), 0);
  StartupInfo.cb := SizeOf(StartupInfo);
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow := SW_HIDE;

  if not CreateProcess('C:\WINDOWS\system32\notepad.exe'nilnilnil, True, 0nilnil, StartupInfo, ProcessInfo) then
    RaiseLastOSError;

  WaitForSingleObject(ProcessInfo.hProcess, INFINITE);

  CloseHandle(ProcessInfo.hProcess);
  CloseHandle(ProcessInfo.hThread);
end;


[edit] Argh ein bisschen langsam. Aber gibt sich vom prinzip her nichts.


Aya - Fr 11.09.09 11:31

Hi,

danke euch - das mit waitForSingleObject war die Lösung :)

Danke~

Aya