Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Advanced Developers Conference     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: WinAPI ::  Mit WaitForSingleObject() auf Beendigung eines Fenster warten?     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Goounda
Unregistrierter




Beitrag Goounda Unregistrierter 11:54:09 12.03.2010   Titel:   Mit WaitForSingleObject() auf Beendigung eines Fenster warten?            Zitieren

Hallo,

ich starte per ShellExecuteEx einen Word-Prozess der mir ein Worddokument öffnet. Ich möchte gerne darauf warten, dass dieses Fenster (vom Benutzer) geschlossen wird, und dann weiter arbeiten.

Allerdings wartet WaitForSingleObject nicht, bis das Fenster geschlossen ist, sondern liefert als Rückgabewert direkt "WAIT_OBJECT_0" zurück - was ja eigentlich bedeuten sollte, dass mein Fenster geschlossen wurde.

Ich verstehe nicht ganz was ich hier falsch mache. Da ich den Prozess selbst starte um den es geht, müsste ich ja auch den richtigen Handle durch die Struktur haben, die ich verwende?!

[cpp]
HELLEXECUTEINFO sei;

memset(&sei, 0, sizeof(sei));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
sei.hwnd = NULL;
sei.lpVerb = "open";
sei.lpFile = sys_call.c_str();
sei.lpParameters = parameter.c_str();
sei.lpDirectory = NULL;
sei.nShow = SW_SHOW;
sei.hInstApp = NULL;

ShellExecuteEx(&sei);
/* ---schnipple-----*/
WaitForSingleObject(sei.hProcess, INFINITE);
[cpp]

Danke für Ideen oder Kommentare
_matze
Mitglied

Benutzerprofil
Anmeldungsdatum: 31.07.2007
Beiträge: 9274
Beitrag _matze Mitglied 12:10:24 12.03.2010   Titel:              Zitieren

Sieht eigentlich richtig aus, ich habe das gleiche vor ein paar Tagen gemacht und es gerade verglichen. Für dich noch mal zum Vergleich:

C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
        SHELLEXECUTEINFO ExecInfo;
        ExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
        ExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
        ExecInfo.hwnd = 0;
        ExecInfo.lpVerb = "open";
        ExecInfo.lpFile = "C:\\xxx\\xxx\\xxx.exe";
        ExecInfo.lpDirectory=0;
        ExecInfo.lpParameters = "";
        ExecInfo.nShow = SW_SHOW;
        ExecInfo.hInstApp = NULL;
        ShellExecuteEx(&ExecInfo);
        WaitForSingleObject(ExecInfo.hProcess, INFINITE);
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
SHELLEXECUTEINFO ExecInfo;
ExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ExecInfo.hwnd = 0;
ExecInfo.lpVerb = "open";
ExecInfo.lpFile = "C:\\xxx\\xxx\\xxx.exe";
ExecInfo.lpDirectory=0;
ExecInfo.lpParameters = "";
ExecInfo.nShow = SW_SHOW;
ExecInfo.hInstApp = NULL;
ShellExecuteEx(&ExecInfo);
WaitForSingleObject(ExecInfo.hProcess, INFINITE);
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
        SHELLEXECUTEINFO ExecInfo;
        ExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
        ExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
        ExecInfo.hwnd = 0;
        ExecInfo.lpVerb = "open";
        ExecInfo.lpFile = "C:\\xxx\\xxx\\xxx.exe";
        ExecInfo.lpDirectory=0;
        ExecInfo.lpParameters = "";
        ExecInfo.nShow = SW_SHOW;
        ExecInfo.hInstApp = NULL;
        ShellExecuteEx(&ExecInfo);
        WaitForSingleObject(ExecInfo.hProcess, INFINITE);


Wenn dein Prozess nicht starten würde, hätte ich gesagt, dass du einfach mal die variablen Parts (die Strings) durch fixe ersetzen solltest. Aber so...?

_________________
Wie viele atheistische Babys hat man schon aus Versehen - oder gar mit Absicht! - getauft?
Goounda
Unregistrierter




Beitrag Goounda Unregistrierter 12:29:15 12.03.2010   Titel:              Zitieren

Ich führe mein Programm über eine Batchdatei aus - könnte das damit etwas zu tun haben? Könnte das verursachen, dass mein Programm dann nicht warten kann?

Wenn ich das Programm direkt ausführe, scheint es nämlich zu funktionieren, nur ich verstehe nicht ganz, was da den Unterschied ausmacht.
_matze
Mitglied

Benutzerprofil
Anmeldungsdatum: 31.07.2007
Beiträge: 9274
Beitrag _matze Mitglied 12:37:13 12.03.2010   Titel:              Zitieren

Goounda schrieb:
Ich führe mein Programm über eine Batchdatei aus - könnte das damit etwas zu tun haben? Könnte das verursachen, dass mein Programm dann nicht warten kann?

Wenn ich das Programm direkt ausführe, scheint es nämlich zu funktionieren, nur ich verstehe nicht ganz, was da den Unterschied ausmacht.


Die Batchdatei wird wahrscheinlich beendet, sie startet halt nur die exe, wartet aber nicht auf deren Beendigung. Das kann man in der Batchdatei auch irgendwie einstellen, ich weiß aber grad nicht mehr wie... EDIT: Musste man da nicht CALL dem exe-Aufruf voranstellen oder so?

EDIT2: Hm, also wenn ich eine Batchdatei starte, die notepad.exe aufruft (ob mit oder ohne call), dann wartet WaitForSingleObject immer ganz korrekt auf Beendigung...

_________________
Wie viele atheistische Babys hat man schon aus Versehen - oder gar mit Absicht! - getauft?


Zuletzt bearbeitet von _matze am 12:54:53 12.03.2010, insgesamt 2-mal bearbeitet
C/C++ Forum :: WinAPI ::  Mit WaitForSingleObject() auf Beendigung eines Fenster warten?   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.