Hallo,
Ich beschäftige mich soeben mit der CreateProcess Funktion. So habe ich im Thread mit dem Titel
Programm starten ohne ShellExecute die unten stehende Funktion gefunden. Leider kann ich im genannten Thread keine Fragen posten, mach das deshalb hier.
Wenn ich einen Server starten will, der als Windows
GUI Programm konzipert ist, hat dieser Prozess ja ein Fensterhandle. Den finde ich später auch mit FindWindow(). Meine Frage hier ist die folgende:
Ich will nämlich den Prozess, den ich mit der Funktion starte nicht sehen. Dieser soll nur als Icon in der Windows Taskleiste rechts unten erscheinen.
Nun enthält aber StartupInfo.dwFlags das Flag "STARTF_USESHOWWINDOW". Was bewirkt das?
Aus der
MSDN Doku werd ich da nicht so recht schlau.
Mit Startupinfo.wShowWindow lege ich doch erst fest, wie das Fenster später angezeigt wird.
Weiterhin verstehe ich das Flag STARTF_FORCEONFEEDBACK nicht!
Wozu brauche ich, wenn ich ein Fensterorientiertes Programm starte die Console?
Delphi-Quellcode:
function RunProcess(FileName: string; ShowCmd: DWORD; wait: Boolean; ProcID: PCardinal): Longword;
var
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
begin
FillChar(StartupInfo, SizeOf(StartupInfo), #0);
StartupInfo.cb := SizeOf(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
StartupInfo.wShowWindow := ShowCmd;
if not CreateProcess(nil,
@Filename[1],
nil,
nil,
False,
CREATE_NEW_CONSOLE or
NORMAL_PRIORITY_CLASS,
nil,
nil,
StartupInfo,
ProcessInfo)
then
Result := WAIT_FAILED
else
begin
try
if not wait then
begin
if ProcID <> nil then ProcID^ := ProcessInfo.dwProcessId;
Result := S_OK;
exit;
end;
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
GetExitCodeProcess(ProcessInfo.hProcess, Result);
finally
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
end;
end;
end;
Ich habe ein kleines Testprogramm gebaut, welches mittels dieser Funktion einen Serverprozess startet. Funktioniert so, wie ich es haben will. Der Serverprozess wird gestartet und ich ich kann vom Client aus mit ihm kommunizieren. Genau wie ich es haben will. Für den Parameter "wait" hab ich narürlich den Wert false gesetzt, denn ich will ja den Client starten, der mit dem von ihm gestarteten Server kommuniziert.
Aber ich verstehe die Bedeutung einiger Flags hier nicht vollständig, weshalb ich diesen Thread hier eröffnet habe. Will nicht nur Quellen übernehmen, die ich dann nicht richtig verstehe, sondern
im Verständnis vorwärts kommen.
Das Flag STARTF_FORCE
ONFEDDBACK suggeriert mir, das die Funktion auf ein Feedback warten soll, was ich aber nicht erhalte. Das ist bei meiner momentanen Absicht richtig, aber so wie ich das mit dem Feedback verstanden habe, müsste es doch dann STARTF_FORCE
NOFEEDBACK heißen? wo liegt da mein Denkfehler?
Was bedeutet die Konstante INFINITE in der folgenden Funktion?:
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
Das sind erst mal alle offenen Fragen, ich hoffe, mir kann jemand antworten.
Damit der Topf nicht explodiert, lässt man es ab und zu mal zischen.