Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Prüfen, ob Programm schon disposed wurde

Mitglied: MarcoBorn

MarcoBorn (Level 1) - Jetzt verbinden

19.09.2019 um 13:35 Uhr, 467 Aufrufe, 17 Kommentare

Hallo Forum,
ich habe in VB.NET ein Programm geschrieben, welches Word startet und dort Daten ausliest. Obwohl ich die Variable, die auf die Word-Applikation verweist, am Ende auf Nothing setze und dispose, bleibt Word im Task-Manager als Prozess weiterhin aktiv. Ich habe dann versucht, das Fenster zu maximieren, damit der Nutzer es manuell schließen kann, aber dann bricht die Prozedur ab.

Word ist weiterhin offen, aber mein Programm hat die Verbindung verloren und kann nicht mehr mit Word interagieren.
Wie kann ich entweder Word sauber beenden oder prüfen, ob es im Task-Manager noch als Prozess läuft und diesen dann sauber beenden (d.h. ggf. mit Möglichkeit zum Speichern)?

Vielen Dank im voraus,
M. Born
Mitglied: 140913
19.09.2019, aktualisiert um 13:47 Uhr
Zitat von MarcoBorn:

Hallo Forum,
ich habe in VB.NET ein Programm geschrieben, welches Word startet und dort Daten ausliest. Obwohl ich die Variable, die auf die Word-Applikation verweist, am Ende auf Nothing setze und dispose, bleibt Word im Task-Manager als Prozess weiterhin aktiv. Ich habe dann versucht, das Fenster zu maximieren, damit der Nutzer es manuell schließen kann, aber dann bricht die Prozedur ab.

Word ist weiterhin offen, aber mein Programm hat die Verbindung verloren und kann nicht mehr mit Word interagieren.
Wie kann ich entweder Word sauber beenden oder prüfen, ob es im Task-Manager noch als Prozess läuft und diesen dann sauber beenden (d.h. ggf. mit Möglichkeit zum Speichern)?
Wird Word über ein COM-Object angesprochen?, für die gibt's Extra Behandlung:
01.
System.Runtime.InteropServices.Marshal.ReleaseComObject(DeinWordObject)
https://docs.microsoft.com/de-de/dotnet/api/system.runtime.interopservic ...

Und vorher am Ende immer ein Quit() auf das Word-Application Object absetzen damit Word "sanft" schließt und nicht einfach nur abgewürgt wird.
Bitte warten ..
Mitglied: MarcoBorn
19.09.2019 um 13:58 Uhr
Wenn ich statt Quit den o.g. Befehl aufrufe, erhalte ich eine Fehlermeldung:
01.
Der Objekttyp muss __ComObject sein oder von __ComObject abgeleitet werden.
02.
Parametername: o
03.
   bei System.Runtime.InteropServices.Marshal.ReleaseComObject(Object o)
Muss ich Word ggf. anders definieren, oder reicht folgendes?
01.
<CLSCompliant(False)> Friend Shared gObjDOKAppWd As Word.Application
02.
gObjDOKAppWd = New Word.Application
Bitte warten ..
Mitglied: emeriks
19.09.2019, aktualisiert um 14:03 Uhr
Hi,
Zitat von MarcoBorn:
Obwohl ich die Variable, die auf die Word-Applikation verweist, am Ende auf Nothing setze und dispose, bleibt Word im Task-Manager als Prozess weiterhin aktiv. Ich habe dann versucht, das Fenster zu maximieren, damit der Nutzer es manuell schließen kann, aber dann bricht die Prozedur ab.
Also das Word.Application Objekt hat meines Wissens keine Dispose-Methode. Weiterhin - für andere Objekte - muss man natürlich erst das Dispose aufrufen (sofern für diese Klasse verfügbar) und dann erst die Variable auf Nothing setzen.

Wie @140913 schon schreibt, muss man das Word-Programm schon explizit über Quit() schließen, weil es als eigenständiger Prozess gestartet wird.

E.
Bitte warten ..
Mitglied: emeriks
19.09.2019 um 14:04 Uhr
Selbst wenn Du das ReleaseComObject absetzt, bleibt sollte die Anwendung weiterhin als Prozess laufen.
Bitte warten ..
Mitglied: MarcoBorn
19.09.2019 um 14:06 Uhr
Gibt es dann keine Möglichkeit, Word wieder zu beenden?
Bitte warten ..
Mitglied: emeriks
19.09.2019, aktualisiert um 14:23 Uhr
Zitat von MarcoBorn:
Gibt es dann keine Möglichkeit, Word wieder zu beenden?
Liest Du unsere Kommentare nicht?
Methode Quit() ausführen! Was sollen wir da noch schreiben?

Edit:
Natürlich bevor Du die Variable auf Nothing setzt, ist klar.
Bitte warten ..
Mitglied: 140913
19.09.2019, aktualisiert um 14:23 Uhr
Zitat von MarcoBorn:

Gibt es dann keine Möglichkeit, Word wieder zu beenden?
Lesen ist schon schwer, stand oben schon in meinem ersten Kommentar.
https://docs.microsoft.com/de-de/office/vba/api/word.application.quit(me ...)
Bitte warten ..
Mitglied: MarcoBorn
19.09.2019 um 14:24 Uhr
Quit und auf Nothing setzen hatte ich ja in meinem ursprünglichen Code schon drin, aber trotzdem ist Word selbst 30 Minuten nach dem Ende des Programms immer noch aktiv. Selbst der GC sollte zwischendurch mindestens einmal durchgelaufen sein. Die Stelle mit Quit und Nothing-setzen wird auch definitiv durchlaufen. Das habe ich testweise mit eine MsgBox davor und danach getestet.

ReleaseComObject bringt mir nur eine Fehlermeldung, hilft mir also leider auch nicht weiter. Was könnte ich noch probieren?
Bitte warten ..
Mitglied: 140913
19.09.2019, aktualisiert um 14:29 Uhr
ReleaseComObject bringt mir nur eine Fehlermeldung
Das ist auch nur mögich wenn Word als reines COM-Object erzeugt wurde, nicht mit managed classes.
aber trotzdem ist Word selbst 30 Minuten nach dem Ende des Programms immer noch aktiv.
Dann wirst du noch andere Referenzen offen haben.
Selbst der GC sollte zwischendurch mindestens einmal durchgelaufen sein.
Den mal testweise die Garbage Collection manuell aufrufen.
Bitte warten ..
Mitglied: MarcoBorn
19.09.2019 um 14:28 Uhr
Hier mal mein Code zum Schließen:
01.
With gObjDOKAppWd
02.
  'Word-Datei schließen und Word beenden
03.
  .DisplayAlerts = Word.Enums.WdAlertLevel.wdAlertsNone
04.
  .ActiveDocument.Close(Word.Enums.WdSaveOptions.wdDoNotSaveChanges)
05.
  .Visible = True
06.
  .Quit(Word.Enums.WdSaveOptions.wdDoNotSaveChanges)
07.
End With
Bitte warten ..
Mitglied: emeriks
19.09.2019, aktualisiert um 14:34 Uhr
Nochmal:
Word läuft als eigener Prozess! Da nützt Dir also "Nothing" und "Garbage Collection" für das Beenden des Prozess überhaupt nichts, weil es sich nur auf die belegten Ressourcen innerhalb Deines Programms bezieht.

Wenn der Prozess nach dem Quit() immer noch läuft, dann bekommst Du im VB.Net doch sicher eine Ausnahme gefeuert, oder?
Bitte warten ..
Mitglied: 140913
19.09.2019, aktualisiert um 14:31 Uhr
.DisplayAlerts = Word.Enums.WdAlertLevel.wdAlertsNone
Dir ist aber schon klar das du damit sämtliche Meldungen auch nach dem Schließen von Word permanent deaktivierst?
Das sollte man vor dem Schließen der Instanz wieder zurücksetzen.
Bitte warten ..
Mitglied: MarcoBorn
19.09.2019 um 14:30 Uhr
Nein, der Code läuft normal durch. Ich habe alle Prozeduren komplett mit Try-Catch gekapselt, aber ich erhalte keine Fehlermeldung. Word wird auch nur einmal zu Anfang des Projekts gestartet.
Bitte warten ..
Mitglied: MarcoBorn
19.09.2019 um 14:41 Uhr
Danke für den Hinweis. Nach dem Schließen der Datei setze ich es wieder auf "All". Ich lasse gerade das Tool durchlaufen. Mal sehen, ob mir jetzt etwas anderes angezeigt wird.
Bitte warten ..
Mitglied: SachsenHessi
19.09.2019, aktualisiert um 15:00 Uhr
Hallo,

dein Problem besteht nicht nur bei Word, sonder auch bei Excel.
Bei beiden arbeitet die Quit()-Methode nicht sauber. Man müsste jetzt über die Marshalling gehen, aber das nervt und ist aufwendig.
(Stichworte: System.Runtime.InteropServices.Marshal und System.Runtime.InteropServices.GCHandle)

Folgendes ist zwar nicht "schön", aber funktioniert und ist schnell und einfach.
Der Ansatz ist einfach den Prozess für die Office-Instanz zu killen.
Das hier sollte auch für Word nutzbar sein (ist für Excel):
01.
    'Um Instanz am ende "abzuschießen",
02.
    'da das Quit/Close nicht korrekt arbeitet
03.
    Public Property procProcessesBeforeStart As Diagnostics.Process()
04.
    Public Property procProcessesAfterStart As Diagnostics.Process()
05.
    Public Property procProcessId4Excel As Int64 = -1  'Um Instanz am ende "abzuschießen"
06.
	
07.
    ''' <summary>
08.
    ''' Gibt die ProcessID der aktiven gerade erstellten Excel Instanz zurück
09.
    ''' </summary>
10.
    ''' <returns></returns>
11.
    Public Function GetExcelProcessID() As Int64
12.

13.
        Dim _intID As Int64 = -1
14.
        procProcessId4Excel = -1
15.
        For Each _itemAfter As Process In procProcessesAfterStart
16.
            Dim _bolDrin As Boolean = False
17.
            For Each _itemBefore As Process In procProcessesBeforeStart
18.
                If _itemBefore.Id = _itemAfter.Id Then
19.
                    _bolDrin = True
20.
                Else
21.
                    _bolDrin = False
22.
                End If
23.
            Next
24.
            If _bolDrin Then
25.
                Continue For
26.
            Else
27.
                _intID = _itemAfter.Id
28.
                Exit For
29.
            End If
30.
        Next
31.
        Return _intID
32.
    End Function
33.

34.

35.
    ''' <summary>
36.
    ''' Killt diese Instanz von Excel endgültig aus dem Speicher
37.
    ''' </summary>
38.
    Public Sub KillExcelThisInstanz(Optional _bolShowError As Boolean = False)
39.
        Try
40.
            If procProcessId4Excel >= 0 Then
41.
                Dim _procExcel As Process = Process.GetProcessById(procProcessId4Excel)
42.
                _procExcel.Kill()
43.
            End If
44.
        Catch ex As Exception
45.
            'hier Fehlerhandling
46.
        End Try
47.
    End Sub
48.
	
49.
    Public Sub Beispiel()
50.
	    procProcessesBeforeStart = Diagnostics.Process.GetProcessesByName("Excel") '<---- !! 
51.
            Dim objXLApp As New Microsoft.Office.Interop.Excel.Application
52.
            Dim objXLSheet As Microsoft.Office.Interop.Excel.Worksheet
53.
            Dim objXLRange As Microsoft.Office.Interop.Excel.Range
54.
            procProcessesAfterStart = Diagnostics.Process.GetProcessesByName("Excel") '<----- !!
55.
            procProcessId4Excel = GetExcelProcessID()  '<--- ProzessID der aktuellen Instanz
56.
            objXLApp.Workbooks.Add("xxxxxxxx")
57.
            objXLApp.Visible = False
58.
            objXLApp.WindowState = Microsoft.Office.Interop.Excel.XlWindowState.xlNormal
59.
            objXLSheet = objXLApp.Workbooks(1).Sheets(1)
60.
            objXLRange = objXLSheet.Range("C2")
61.
            objXLRange.Value = "blahblah"
62.
            If IO.File.Exists("xxxxxxx") Then IO.File.Delete("xxxxxxx")
63.
            objXLApp.Workbooks(1).SaveAs("xxxxxxxxxx", Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookDefault)
64.
            objXLApp.Quit()
65.
            KillExcelThisInstanz()  '<---- und heier wird diese Instanz wider gekillt
66.
	end sub
Bitte warten ..
Mitglied: MarcoBorn
19.09.2019 um 15:06 Uhr
Danke. Hier wird zwar Word nicht sauber beendet, sondern nur abgeschossen. Aber ich werde mal testen, ob das zumindest als Notlösung funktioniert.
Bitte warten ..
Mitglied: SachsenHessi
19.09.2019 um 15:25 Uhr
Hatte ich geschrieben, nicht "schön" aber funktioniert.
Selbst nach einem
Quit()
Marshal.ReleaseComObject()
GCCollect()
GC.WaitForPendingFinalizers()
war es teilweise (besser häufiger) noch aktiv.
daher diese frickel-lösung.

Gruß
SH
Bitte warten ..
Ähnliche Inhalte
Multimedia
Diashow Programm
gelöst Frage von 77282Multimedia6 Kommentare

Hallo, ich suche eine Software zum Diashow erstellen. Möchte gerne Videoclips und Bilder hinzufügen können und das Ganze mit ...

Grafik
CAD Programm Cade
Frage von rocco61Grafik2 Kommentare

Hallo zusammen, habe mir das CAD CADE geholt, ist prima und dem teueren Pedanten Visio sehr ähnlich. Nur, würde ...

Windows Server
CRM Programm Problem
gelöst Frage von DaHuberWindows Server7 Kommentare

Hallo zusammen, Haben 2 Cluster rds 1 rds 2 nenne ich die mal ein Programm Cobra CRM, das auf ...

Batch & Shell
Fehler in Programm
Frage von IleiesBatch & Shell9 Kommentare

Hallo zusammen, Ich habe jetzt dieses Programm geschrieben: in der " ;%profile%-%dato%.dat"-Datei steht meistens sowas: An einem anderen sowas: ...

Neue Wissensbeiträge
Windows 10
Die tickende DSGVO-Zeitbombe von Microsoft
Information von Frank vor 10 StundenWindows 101 Kommentar

Hier ein guter Beitrag von Golem.de zum Thema DSGVO und das Windows 10 aktuell nicht DSGVO konform ist! Das ...

Microsoft Office

Gebrandete OEM-Version von Office 2003 auf Nachfolgerechner installieren

Tipp von Lochkartenstanzer vor 12 StundenMicrosoft Office

Hallo Kollegen, gerade mal wieder ein Kundensystem mit Widows 10 in den Fingern gehabt, bei dem der Besitzer sein ...

Windows Server

Ein Feature, welches einem das Arbeiten mit Windows-2019-Coreservern erleichtern kann

Information von DerWoWusste vor 12 StundenWindows Server2 Kommentare

Man kann mittels Kommando nun folgendes auf Server 2019 in der Coreversion v1809 freischalten, so dass man es lokal ...

Windows 10
MS möchte offenbar lokale Konten abschaffen
Information von UweGri vor 1 TagWindows 1011 Kommentare

Guten Tag Admins, ab und an lese ich bei Dr.-Windows Bei dieser Meldung dachte ich, wird MS jetzt offen ...

Heiß diskutierte Inhalte
Erkennung und -Abwehr
MS-Hotline-Telefonterror
Frage von HenereErkennung und -Abwehr22 Kommentare

Servus zusammen, seit ca 3 Wochen haben wir immer wieder Anrufe von unbekannten Nummern, teils aus dem Ausland. Nach ...

Batch & Shell
Active Directory Picker - Get-ADGroup kann nicht in den Typ konvertiert werden
Frage von dispatcherBatch & Shell17 Kommentare

Mahlzeit zusammen, Im folgenden Skript erhalte ich immer die Meldung: Get-ADGroup : "System.Object " kann nicht in den Typ "Microsoft.ActiveDirectory.Management.ADGroup" ...

Batch & Shell
Last Logon Datum per Powershell abrufen
gelöst Frage von DerWoWussteBatch & Shell12 Kommentare

Moin Kollegen. Wer ist vor 10 schon so fit, mir Folgendes zu erklären: Das zum Titel passende Skript ist ...

Windows 10
Windows 10 mit kaputtem .Net 4.8
Frage von krischeuWindows 1012 Kommentare

Hi, ich habe mit dem Programm ADDISON ein Stabilitätsproblem. Es stürzt regelmäßig während des Arbeitens ab. In der Ereignisanzeige ...