Entwickler-Ecke

Windows API - Prozess starten und warten...


Bart Simpson - Do 01.08.02 22:31
Titel: Prozess starten und warten...
Wenn ich mit Hilfe der Funktion CreateProcess(...) eine Anwendung starte, ist es kein Problem mich an die ranzuhängen und zu warten bis mein "Client" beendet ist.

Andererseits kann ich mittels ShellExecute(...) nicht nur Programme starten, sondern auch "Dokumente" wobei Windows für micht ermittelt, welche Applikation verknüpft ist und diese dann entsprechend startet.

Meine Frage nun: Gibt's das auch kombiniert? Ich möchte Doc's starten, und trotzdem auf das Ende der Bearbeitung warten...

Oder Alternativ: Gibt's Bordmittel um die richtige Anwendung zu finden, oder muss ich mich tatsächlich selbst durch die Registry wühlen???
Das einzige was ich darüber _irgendwo_ finden konnte war eine url.dll. Von der scheint aber nicht mal die komplette MSDN was zu wissen...

Bart Simpson


DBR - Fr 02.08.02 03:22

Schon mal so versucht?
---------------------------

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
uses shellapi;

var
StartupInfo:TStartupInfo;
ProcessInfo:TProcessInformation;
doc:string;
buf:array[0..max_path-1]of char;

function start:boolean;
begin
StartupInfo.cb := Sizeof(StartupInfo);
FillChar(StartupInfo,Sizeof(StartupInfo),#0);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := SW_MAXIMIZE;
result:=CreateProcess(
nil,
pchar(string(buf)+#32+doc),
nil,
nil,
false,
CREATE_NEW_CONSOLE or
NORMAL_PRIORITY_CLASS,
nil,
nil,
StartupInfo,
ProcessInfo);
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
doc:='C:\test.doc';
findexecutable(pchar(doc),nil,buf);
if not start then
showmessage('Fehler')
else begin
repeat
Application.ProcessMessages;
// hier können bei Bedarf weitere Dinge
// passieren, während der andere Prozess läuft
until
(WaitforSingleObject(ProcessInfo.hProcess,0)<>WAIT_TIMEOUT)
or(application.terminated);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
showmessage('Das aufgerufenen Fenster wurde soeben geschlossen');
end;
end;


gruss DBR


Bart Simpson - Fr 02.08.02 13:07


Quelltext
1:
findexecutable(pchar(doc),nil,buf);                    


Das war's, was ich gesucht hatte! Danke!