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
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);
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?
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..
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?
Guybrush Threepwood Geschrieben 6. April 2006 Geschrieben 6. April 2006 Na das das du beim starten von Word bekommst
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
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
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.
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?
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...
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??
Klotzkopp Geschrieben 7. April 2006 Geschrieben 7. April 2006 Ein Handle, auf das du warten kannst, bekommst du nur mit ShellExecuteEx oder CreateProcess.
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); }
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.
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!!!!
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...
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); }
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.
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:
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 ); }
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?
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?
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden