PowerLooser Geschrieben 14. Mai 2009 Geschrieben 14. Mai 2009 (bearbeitet) Hallo Leuts ich habe mal wieder eines meiner Probleme mit einer Officeanwendung 2003 ... :eek Ich nutze Visualstudio 2008 und möchte hier in einem "Webbrowserdialog" einige Dokumente anzeigen lassen. das funktioniert ganz vorzüglich, bis dann mal wieder irgendwann WinWord mal wieder einen Dokument "z.B. Test.doc" nicht richtig schließt und dann mein ganzes Programm abstürzt, weil nach Fehlermeldung "Ein noch aktiver Prozess" die weitere Arbeit blockiert. Ich habe schon das Internet durchforstet aber nichts brauchbares gefunden. Ich vermute das der Garbage Collector nicht richtig arbeit und das Finally somit nicht abgeschlossen wird. Dadurch wird meine Datei zwar geschlossen aber WinWord bleibt geöffnet. Sobald dann eine neue Datei geöffnet werden soll, dann stürzt wieder alles ab. Ich kann dann über den Taskmanager die Anwendung manuell beenden. Dann funktioniert es mal wieder... aber nur ein paar Mal. Hat jemand Erfahrungen wie man MIttels einer Anwendung aus VB.net 2008 heraus vielleicht Prozesse oder Anwendungen beenden kann. Bearbeitet 14. Mai 2009 von PowerLooser Zitieren
Vandahil Geschrieben 14. Mai 2009 Geschrieben 14. Mai 2009 Kenne mich in vb nicht so gut aus, aber kannst du den GarbageCollector selbst aktivieren? Java biete die Möglichkeit, wenngleich auch hier das eher dem Zufall überlassen ist, ob der GC sich dem "Müll" annimmt. Zitieren
0815FIA Geschrieben 15. Mai 2009 Geschrieben 15. Mai 2009 1. Weg: Word.Application oWord = null; oWord = (Word.Application)Marshal.GetActiveObject("Word.Application"); oWord.Quit(); für diesen code mußt du allerdings die Interop.Word.dll einbinden, und Quit erwartet Parameter. 2. Weg: Process[] pSearch = Process.GetProcessesByName("WINWORD"); foreach (Process p in pSearch) { if (p is Process) p.Kill(); } Zitieren
Saba1001 Geschrieben 27. Mai 2009 Geschrieben 27. Mai 2009 Ist das Problem inzwischen gelöst? Genau dieses habe ich auch. Über jede Info hierzu sehr dankbar. Zitieren
HJST1979 Geschrieben 28. Mai 2009 Geschrieben 28. Mai 2009 2. Weg: Process[] pSearch = Process.GetProcessesByName("WINWORD"); foreach (Process p in pSearch) { if (p is Process) p.Kill(); } Habe zwar keine bessere Lösung aber ^^ diesen Weg halte ich für gefährlich denn er killt dir JEDEN Winword- Prozess auch den wenn du noch nebenbei ein anderes Dokument offen hast. mfg Hans-Jörg Zitieren
Saba1001 Geschrieben 30. Mai 2009 Geschrieben 30. Mai 2009 Vielen Dank für die Info, der Kill funktioniert schon, er killt auch andere Jobs des Words. Da ich in meiner Anwendung ca 7000 Docs bearbeiten wollte und somit entsprechende Kill-Anforderungen abgeschickt habe war meine Windows-Installation nicht mehr zu gebrauchen. Es lief nichts mehr. Das Problem wird wohl irgendwo in der Nähe des Garbage-Collectors liegen. Auch reagiert WinXP ganz anders als Vista. Gruß Zitieren
PowerLooser Geschrieben 4. Juni 2009 Autor Geschrieben 4. Juni 2009 (bearbeitet) Vielen Dank für die Info, der Kill funktioniert schon, er killt auch andere Jobs des Words. Da ich in meiner Anwendung ca 7000 Docs bearbeiten wollte und somit entsprechende Kill-Anforderungen abgeschickt habe war meine Windows-Installation nicht mehr zu gebrauchen. Es lief nichts mehr. Das Problem wird wohl irgendwo in der Nähe des Garbage-Collectors liegen. Auch reagiert WinXP ganz anders als Vista. Gruß Hallo Saba1001 Ich habe das Problem auf meie Weise ersteinmal gelöst. :-) Da ich meine Dokumente heraus im eigenen Browser laden lasse, wird zu jedem Documet ein eigener Process gestartet. Hierbei war das Problem stets, dass es zu keinem Finally kam und mein System schneller war, als "Winword" selber. Die internen Processe von "Winword" waren noch nicht abgeschlossen und es kam daher zur Fehlermeldung. Also lasse ich mir jeweils die Dateiendungen meiner Dateien bestimmen und lasse dazu wenn das System hängt einfach den Prozess killen. Ich habe dem Rechner einfach noch eine kurze Auszeit verpaßt und schon hat es funktioniert. Imports System.Threading private sub Datei_killen() Dim Dateiname, Endung ' Hier kann deine Datei als Variable ausgegeben werden Dateiname = "Testdokument.doc" Endung = Mid(Dateiname, InStrRev(Dateiname, ".")) If Endung = ".doc" Then Dim name As String = "Winword" Dim procs As Process() = Process.GetProcessesByName(name) For Each p As Process In procs 'If p.MainWindowTitle = String.Empty Then p.CloseMainWindow() p.Kill() GoTo gekillt 'End If Next End If If Endung = ".xls" Then Dim name As String = "Excel" Dim procs As Process() = Process.GetProcessesByName(name) For Each p As Process In procs 'If p.MainWindowTitle = String.Empty Then p.CloseMainWindow() p.Kill() GoTo gekillt 'End If Next End If ' weitere Dokumentenendungen selber anfügen gekillt: Dim i as Integer=0 Do While i < 3 Thread.Sleep(2000) i = i + 1 Loop end sub Bei mir hat es bisher prima funktioniert. Versuch macht klug. Du mußt nur die entsprechenden Endungen deiner Dateien festlegen, die mit in der Routine behandelt werden sollen. :old Bearbeitet 4. Juni 2009 von PowerLooser Zitieren
PowerLooser Geschrieben 4. Juni 2009 Autor Geschrieben 4. Juni 2009 Thx geht natürlich noch an HJST1979 und 0815FIA für eure schnellen Anworten. Konnte leider nicht eher den Dank verschicken! :e@sy Zitieren
0815FIA Geschrieben 4. Juni 2009 Geschrieben 4. Juni 2009 np ich würde noch .xlsx und .docx dazunehmen, damit das auch für 2007er docs funktioniert. Zitieren
PowerLooser Geschrieben 4. Juni 2009 Autor Geschrieben 4. Juni 2009 np ich würde noch .xlsx und .docx dazunehmen, damit das auch für 2007er docs funktioniert. Guter Gedanke .. man weiß ja nie! :floet: 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.