dämonen, die syscalls machen

06/04/2010 - 16:41 von Tonio Raspari | Report spam
Hallo Leute,

auch wenn der Titel eher komisch klingt, habe ich ein ziehmliches Problem.
Wenn ich aus einem C/C++ Programm, welches im Hintergrund làuft, heraus
einen Systemaufruf starte, geht für die Zeit die der Aufruf brauch eine
Cmd-Konsole auf.
Ich habe es mit System() und popen() versucht, jeweils ohne Erfolg.
Wie kann ich also einen Syscall machen, ohne dass jedesmal ein Fenster
aufblitzt, wenn das Programm seine Arbeit tut?

Tonio
 

Lesen sie die antworten

#1 Felix Opatz
06/04/2010 - 20:27 | Warnen spam
Am 06.04.2010 16:41, schrieb Tonio Raspari:

Ich habe es mit System() und popen() versucht, jeweils ohne Erfolg.
Wie kann ich also einen Syscall machen, ohne dass jedesmal ein Fenster
aufblitzt, wenn das Programm seine Arbeit tut?



Mit CreateProcess. Entscheidend für Dein Vorhaben ist der Parameter
dwCreationFlags, dort gibt es eine Konstante CREATE_NO_WINDOW.

Im Gegensatz zu system() ist CreateProcess allerdings nicht blockierend.
Wenn Dein Hauptprogramm erst weitergehen soll, wenn der gestartete
Prozess fertig ist, mußt Du gezielt darauf warten. Am Besten mit
WaitForSingleObject auf das Prozess-Handle (Element des letzten
Parameters zu CreateProcess).

Die Funktion ist zugegebenermaßen nicht ganz simpel, aber probier's
ruhig mal. Ich schlage folgendes zu berücksichtigen:

- lpApplicationName darf NULL sein, wenn lpCommandLine mit dem
Programm-Namen anfàngt
- lpProcessAttributes und lpThreadAttributes dürfen NULL sein
- lpEnvironment und lpCurrentDirectory dürfen NULL sein
- für lpStartupInfo und lpProcessInformation am bequemsten Strukturen
lokal anlegen und deren Adresse übergeben
- Strukturen vorher leeren und/oder mit sinnvollen Werten belegen
- lpStartupInfo->cb muß sizeof(STARTUPINFO) sein
- nach Rückkehr der Funktion die Handles in lpProcessInformation mit
CloseHandle schließen, sonst Handle-Leaks

Das ist die simpelste Form. Solltest Du Anforderungen haben, die davon
nicht abgedeckt werden, musst Du Dich durch die Doku quàlen. Wenn's dann
immer noch nicht geht, einfach nochmal hier fragen.

Viel Erfolg!

Gruß,
Felix

Ähnliche fragen