Veröffentlicht 6. April 200619 j 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
6. April 200619 j Mit ShellExecute... ShellExecute(NULL,"open",m_DBSettings.m_DefaultDocPath + "\\Vorlage\\Scannen.dot",NULL,NULL,SW_SHOWNOACTIVATE);
6. April 200619 j 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?
6. April 200619 j Mit WaitForSingleObject könntest du zumindest warten bis Word geschlossen wird. Aber ob er gespeichert hat weißt du so nicht..
6. April 200619 j 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?
6. April 200619 j 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
7. April 200619 j 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
7. April 200619 j 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.
7. April 200619 j 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?
7. April 200619 j system... (****** Case Sensitiv :floet:) musst mal in der msdn schauen wo das liegt... glaub aber in stdio oder iostream oder so was...
7. April 200619 j 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??
7. April 200619 j Ein Handle, auf das du warten kannst, bekommst du nur mit ShellExecuteEx oder CreateProcess.
7. April 200619 j 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); }
7. April 200619 j 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.
7. April 200619 j 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!!!!
7. April 200619 j 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...
7. April 200619 j 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); }
7. April 200619 j 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.
7. April 200619 j Das Prozesshandle, auf das du warten kannst, steht im hProcess-Member, wenn du bei fMask SEE_MASK_NOCLOSEPROCESS setzt. ..........:floet:
7. April 200619 j ..........: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 ); }
7. April 200619 j 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?
7. April 200619 j 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?
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.