Filou Geschrieben 6. April 2006 Geschrieben 6. April 2006 Hi! Hab folgendes Problem: Mein Programm öffnet Micorsoft Word zum scannen von Dokumenten. Der Benutzer speichert diese in ein Verzeichnis. Dann soll mein Programm das Dokument aus dem Vezeichnis holen und weiter damit arbeiten. Nur woher weiß mein Programm, dass der User die Datei gespeichert und Word beendet hat? Ich wollte es mit einer MessageBox machen. Also dass man erst die MessageBox schließt bevor das Programm weiterläuft. Leider drängt sich die MessageBox vor Word. D.H. wenn man nicht in die Taskleiste schaut bekommt man gar nicht mit, dass Word aufgeganegen ist weil die MessageBox und mein Programm dann im Vordergrund ist. Gibts da nicht eine schönere Lösung wie man das machen könnte? Habt Ihr ne Idee wie man das lösen könnte? Gruß, Filou Zitieren
Klotzkopp Geschrieben 6. April 2006 Geschrieben 6. April 2006 Kommt drauf an, wie du Word startest. Zitieren
Filou Geschrieben 6. April 2006 Autor Geschrieben 6. April 2006 Mit ShellExecute... ShellExecute(NULL,"open",m_DBSettings.m_DefaultDocPath + "\\Vorlage\\Scannen.dot",NULL,NULL,SW_SHOWNOACTIVATE); Zitieren
Filou Geschrieben 6. April 2006 Autor Geschrieben 6. April 2006 Ja das wäre eine Möglichkeit! Super Idee! Wie macht man das? Also mit welcher Funktion sage ich dem Dialog er soll minimiert sein? Zitieren
Guybrush Threepwood Geschrieben 6. April 2006 Geschrieben 6. April 2006 Mit WaitForSingleObject könntest du zumindest warten bis Word geschlossen wird. Aber ob er gespeichert hat weißt du so nicht.. Zitieren
Filou Geschrieben 6. April 2006 Autor Geschrieben 6. April 2006 Mit WaitForSingleObject könntest du zumindest warten bis Word geschlossen wird. Aber ob er gespeichert hat weißt du so nicht.. Das wäre toll!! Ob er gespeichert hat oder nicht weiß ich dan, wenn das Verzeichnis leer ist. Was für ein Handle muss ich in der Funktion angeben? Wie funktioniert das genau? Woher weiß ich welches Handle Word hat? Zitieren
Guybrush Threepwood Geschrieben 6. April 2006 Geschrieben 6. April 2006 Na das das du beim starten von Word bekommst Zitieren
Filou Geschrieben 6. April 2006 Autor Geschrieben 6. April 2006 Das mit den Handles hab ich nie ganz kapiert. :confused: Ich mache jetzt aber Feierabend. Melde mich morgen nochmal wenn ichs nicht hin bekomme. Danke Euch trotzdem!!!! Bye Zitieren
Filou Geschrieben 7. April 2006 Autor Geschrieben 7. April 2006 Guten Morgen Leutz Ich habe es jetzt mit WaitForSingleObject versucht. Das Programm läuft, es bekommt nur noch nicht mit dass Word geschlossen wurde... Ich habs so gemacht: DWORD WINAPI test; HWND hWnd; //Dokumentenvorlage zum Scannen öffnen ShellExecute(hWnd,"open",m_DBSettings.m_DefaultDocPath + "\\Vorlage\\Scannen.dot",NULL,NULL,SW_SHOWNOACTIVATE); test = WaitForSingleObject(hWnd, 10000); while (test != 0x00000000L) { test = WaitForSingleObject(hWnd, 10000); } Es soll so lange warten bis Word beendet ist. Gruß, Filou Zitieren
TDM Geschrieben 7. April 2006 Geschrieben 7. April 2006 Auch wenn es vielleicht nicht so guter Programmierstil ist: System([Pfad zur Exe] [Parameter]); Danach wird meines Wissens auf jedenfall solang gewartet bis das Programm beendet wurde... Kann mich aber auch irren. Zitieren
Filou Geschrieben 7. April 2006 Autor Geschrieben 7. April 2006 Auch wenn es vielleicht nicht so guter Programmierstil ist: System([Pfad zur Exe] [Parameter]); Danach wird meines Wissens auf jedenfall solang gewartet bis das Programm beendet wurde... Kann mich aber auch irren. 'System' : nichtdeklarierter Bezeichner Kann es auch nicht in der MSDN finden. Nur als C#. Bist Du Dir sicher dass es das gibt? Zitieren
TDM Geschrieben 7. April 2006 Geschrieben 7. April 2006 system... (****** Case Sensitiv :floet:) musst mal in der msdn schauen wo das liegt... glaub aber in stdio oder iostream oder so was... Zitieren
Filou Geschrieben 7. April 2006 Autor Geschrieben 7. April 2006 Das funktioniert irgendwie nicht. Da geht nur die Eingabeaufforderung auf. Aber öffnet mein Dokument nicht. Wenn ich den selben Pfad in die Eingabeaufforderung schreibe dauerts nen Moment und dann geht es aber auf. Vielleicht könnt Ihr mir nochmal bei WaitForSingleObject helfen?? Zitieren
Klotzkopp Geschrieben 7. April 2006 Geschrieben 7. April 2006 Ein Handle, auf das du warten kannst, bekommst du nur mit ShellExecuteEx oder CreateProcess. Zitieren
Filou Geschrieben 7. April 2006 Autor Geschrieben 7. April 2006 Danke für den Tip! Aber ich verzweifle!!! ich bekomms einfach net hin! :beagolisc :( :( DWORD WINAPI test; HWND hWnd; //Dokumentenvorlage zum Scannen öffnen LPSHELLEXECUTEINFO lpExecInfo; lpExecInfo->hwnd = hWnd; lpExecInfo->lpDirectory = m_DBSettings.m_DefaultDocPath + "\\Vorlage\\"; lpExecInfo->lpFile = "scannen.dot"; lpExecInfo->nShow = SW_SHOWMAXIMIZED; ShellExecuteEx(lpExecInfo); test = WaitForSingleObject(lpExecInfo->hwnd, 10000); while (test != WAIT_ABANDONED) { test = WaitForSingleObject(lpExecInfo->hwnd, 10000); } Zitieren
Klotzkopp Geschrieben 7. April 2006 Geschrieben 7. April 2006 LPSHELLEXECUTEINFO lpExecInfo; lpExecInfo->hwnd = hWnd;[/code] Man sieht es dem Typen nicht direkt an, aber LPSHELLEXECUTEINFO ist ein Zeiger - das erkennst du an dem LP. Du schreibst also hier über einen uninitialisierten Zeiger irgendwo im Speicher herum. Du musst ein SHELLEXECUTEINFO-Objekt anlegen und dessen Adresse übergeben. Außerdem musst du die Struktur mit {0} initialisieren, sonst stehen in den Membern, die du nicht zuweist, willkürliche Werte. Den cbSize-Member musst du auf sizeof SHELLEXECUTEINFO setzen. Auf Fensterhandle kann man nicht warten. Das [b]Prozess[/b]handle, auf das du warten kannst, steht im hProcess-Member, wenn du bei fMask SEE_MASK_NOCLOSEPROCESS setzt. Zitieren
Filou Geschrieben 7. April 2006 Autor Geschrieben 7. April 2006 Man sieht es dem Typen nicht direkt an, aber LPSHELLEXECUTEINFO ist ein Zeiger - das erkennst du an dem LP. Du schreibst also hier über einen uninitialisierten Zeiger irgendwo im Speicher herum. Du musst ein SHELLEXECUTEINFO-Objekt anlegen und dessen Adresse übergeben. Außerdem musst du die Struktur mit {0} initialisieren, sonst stehen in den Membern, die du nicht zuweist, willkürliche Werte. Den cbSize-Member musst du auf sizeof SHELLEXECUTEINFO setzen. Auf Fensterhandle kann man nicht warten. Das Prozesshandle, auf das du warten kannst, steht im hProcess-Member, wenn du bei fMask SEE_MASK_NOCLOSEPROCESS setzt. Danke für die ausführliche erklärung. Aber ganz kapiert hab ichs noch nicht. Schau mal: SHELLEXECUTEINFO *lpExecInfo; //Dokumentenvorlage zum Scannen öffnen lpExecInfo->cbSize = sizeof(SHELLEXECUTEINFO); lpExecInfo->dwHotKey=0; lpExecInfo->fMask=0; lpExecInfo->hIcon=0; lpExecInfo->hInstApp=0; lpExecInfo->hkeyClass=0; lpExecInfo->hMonitor=0; lpExecInfo->hProcess=0; lpExecInfo->lpClass=0; lpExecInfo->lpIDList=0; lpExecInfo->lpParameters=0; lpExecInfo->lpVerb=0; lpExecInfo->hwnd = hWnd; lpExecInfo->lpDirectory = m_DBSettings.m_DefaultDocPath + "\\Vorlage\\"; lpExecInfo->lpFile = "scannen.dot"; lpExecInfo->nShow = SW_SHOWMAXIMIZED; ShellExecuteEx(lpExecInfo); So lässt es sich kompilieren, läuft aber neicht. Ich hatte Dein Post so vertanden: SHELLEXECUTEINFO *LPSHELLEXECUTEINFO; *LPSHELLEXECUTEINFO lpExecInfo; Aber das lässt sich nicht kompilieren. *seuftz* ICH HASSE POINTER!!!! Zitieren
Klotzkopp Geschrieben 7. April 2006 Geschrieben 7. April 2006 Danke für die ausführliche erklärung. Aber ganz kapiert hab ichs noch nicht. Schau mal: SHELLEXECUTEINFO *lpExecInfo; //Dokumentenvorlage zum Scannen öffnen lpExecInfo->cbSize = sizeof(SHELLEXECUTEINFO);[/code] Gleiches Problem wie vorher: Uninitialisierter Zeiger. [code]SHELLEXECUTEINFO sei = {0}; sei.cbSize = sizeof SHELLEXECUTEINFO; usw... Zitieren
Filou Geschrieben 7. April 2006 Autor Geschrieben 7. April 2006 Dankeschön!!! :e@sy Das öffnen klappt jetzt!! Allerdings seht in meinem hProcess immer das selbe drin. Egal ob ich Word schließe oder nicht. Der Inhalt ist immer 4294967295. Was sitmmt da nicht? ShellExecuteEx(&lpExecInfo); test = WaitForSingleObject(lpExecInfo.hProcess, 2000); //Warten bis Word beendet ist. while (test != WAIT_OBJECT_0) { test = WaitForSingleObject(lpExecInfo.hProcess, 2000); } Zitieren
Guybrush Threepwood Geschrieben 7. April 2006 Geschrieben 7. April 2006 Du musst einfach nur INFINITE als 2. Parameter an WaitForSingleObject übergeben, dann wartet die Funktion solange bis Word beendet wurde und kehrt erst dann zurück. Zitieren
Klotzkopp Geschrieben 7. April 2006 Geschrieben 7. April 2006 Das Prozesshandle, auf das du warten kannst, steht im hProcess-Member, wenn du bei fMask SEE_MASK_NOCLOSEPROCESS setzt. ..........:floet: Zitieren
Filou Geschrieben 7. April 2006 Autor Geschrieben 7. April 2006 ..........:floet: Ok *in die ecke stell und schäm* aber es geht immer noch nicht. da steht immernoch die selbe zahl in test. DWORD WINAPI test; HWND hWnd; CString csPfad = m_DBSettings.m_DefaultDocPath + "\\Vorlage\\"; //Struktur zum Öffnen mit ShellExecuteEx SHELLEXECUTEINFO lpExecInfo = {0}; lpExecInfo.hProcess = hWnd; lpExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; lpExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); lpExecInfo.lpDirectory = csPfad; lpExecInfo.lpFile = "scannen.dot"; lpExecInfo.nShow = SW_SHOWMAXIMIZED; ShellExecuteEx(&lpExecInfo); test = WaitForSingleObject(lpExecInfo.hProcess, INFINITE ); //Warten bis Word beendet ist. while (test != WAIT_OBJECT_0) { test = WaitForSingleObject(lpExecInfo.hProcess, INFINITE ); } Zitieren
Klotzkopp Geschrieben 7. April 2006 Geschrieben 7. April 2006 Läuft Word möglicherweise schon? Ein Prozesshandle bekommst du nur, wenn durch ShellExecuteEx auch wirklich ein Prozess gestartet wird. Was gibt ShellExecuteEx zurück? Was steht in lpExecInfo.hProcess? Was gibt WaitForSingleObject zurück? Zitieren
Filou Geschrieben 7. April 2006 Autor Geschrieben 7. April 2006 Läuft Word möglicherweise schon? Ein Prozesshandle bekommst du nur, wenn durch ShellExecuteEx auch wirklich ein Prozess gestartet wird. Was gibt ShellExecuteEx zurück? Was steht in lpExecInfo.hProcess? Was gibt WaitForSingleObject zurück? Ok, Du hast es wieder mal auf Anhieb erraten! Also es ist so. Ich verwende Office 2003 und da läuft Word als Prozess im Hintergrund wenn Outlook aktiv ist. Also wird der Prozess niemals wirklich beendet. Selbst wenn ich Outlook schließe, Word öffne und dann wieder beende läuft der prozess weiter im Hintergrund. Erst wenn ich den Prozess im Taskmanager abwürge läuft mein Programm dann weiter. Also tut mein Programm im Grunde das, was es soll... Nur Word nicht... Was ein Sch*** Was nun? Hast Du noche ine Idee? Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.