Writer Steuerelemente fehlen auf Terminalserver v6.4.5 + Prozesse hängen & v7.0.2 GUI lässt sich nicht schließen

Hallo liebe Community,

vielleicht hat jemand eine Ahnung weswegen wir seit den 6er Versionen von Libreoffice Probleme mit dem x86 Programm auf unseren Terminal Servern (alle Systeme von 2008 R2 bis 2019) haben. Wir benötigen die 32bit Version, da wir Libreoffice meistens aus einer 32bit VB Applikation ansprechen. Wir öffnen z.B. eine Vorlage und tauschen dann in der Vorlage vorhandene Platzhalter mit Daten aus. Den verwendeten Code poste ich separat. Meistens tritt der Steuerelemente Fehler dabei auf, da dies 99% der Fälle sind in denen der Writer geöffnet wird. Generell liegt aber auch das verhalten vor, das selbst wenn der Vorgang funktioniert, nach dem beendet von Writer immer der soffice.exe und soffice.bin Prozess offen bleibt (dies sollte doch nicht normal sein oder?) und dies passiert bei allen Termin Benutzern. Die einzige Lösung die kurze Abhilfe schafft ist alle Prozesse zu killen.

Installiert wird das Libreoffice MSI File wie folgt:
msiexec.exe /i “LibreOffice_6.4.5_Win_x86.msi” ALLUSERS=1 /qn /norestart /log output.log ADDLOCAL=ALL AgreeToLicense=Yes CREATEDESKTOPLINK=0 REGISTER_ALL_MSO_TYPES=1 REMOVE=gm_o_Onlineupdate RebootYesNo=No

Der Server wird dann aber nach der Installation immer Nachts durchgestartet.

Der Steuerelemente Fehler sieht wie folgt aus. Alls Menüs und Buttons sind vorhanden aber einfach nur nicht sichtbar. Oft fehlen diese schon beim öffnen der Vorlage, oft erst nachdem einmal gedruckt wurde, worauf das Programm nicht mehr zu verwenden ist bis wirklich ALLE soffice Prozesse auf dem Server beendet wurden.

Hat irgendjemand auch nur im entferntesten eine Ahnung woran das liegen könnte und was ich zur Fehlerbehebung oder Fehlerfindung machen könnte? Bin gerade mit meinem Latein am Ende.

Viele Grüße und schon einmal Danke vorweg …
Sebastian

---------- 20201014 Hinzugefügt---------

Ich habe heute auf einem Testserver Windows 2012R2 mal die neuste 7.0.2 installiert.
Hier ist der Steuerelemente Fehler zwar noch nicht auf getreten, aber es gibt eine neue Variante der nicht richtig reagierenden soffice.exe und soffice.bin Prozesse.

Wenn durch den Benutzer eine .ott via CreateOpenOfficeService(“com.sun.star.frame.Desktop”) geöffnet und via Makros befüllt wird, kann er zwar das Dokument via kleinem x schließen, es ist Ihm aber nicht möglich das Libreoffice Hauptfenster zu schließen. Die Windows Gui reagiert einfach nicht auf das schließen, egal ob über x oder über Taskleiste Rechtklick schließen. Der Prozess muss via Task-Manager gekillt werden.
Wenn der Benutzer den Writer aber einfach so öffnet und ein neues Dokument erstellt, funktioniert alles ganz normal. Auch wenn er die .ott öffnet und diese wieder schließen will, geht das auch wie erwartet.

Scheinbar hat sich das Phänomen der soffice.exe und soffice.bin Prozesse in der neuen Version in die GUI verschoben. Obwohl man die Libreoffice Prozesse via CreateOpenOfficeService(“com.sun.star.frame.Desktop”) nicht über die GUI beenden kann, ist es möglich fröhlich mit diesen weiter zu arbeiten, neue Dokumente zu erstellen etc.

Mittlerweile denke ich das in v6.4.5 die hängenden Prozesse das fehlen der Steuerelemente beim öffnen neuer Dokumente verursacht haben. In der v7.0.2 zeigt sich nun aber das wahre Problem, das Libreoffice einfach Probleme hat die über Makro via einer .ott Datei erzeugten Prozesse, sauber zu händeln.

Hat irgendjemand eine Idee wie ich weiter nach der Ursache für das Problem suchen kann oder vielleicht sogar einen Lösungsansatz?

Beste Grüße
Sebastian

Ganz verstehe ich die Frage nicht (inbesondere wie und unter welchem Benutzeraccount LibreOffice gestartet wird) aber habt Ihr mal drüber nachgedacht, die/das entsprechende(n) Benutzerprofil(e) zurückzusetzen?

Libreoffice läuft auf dem Terminalserver - sprich wird pro Benutzer in diesem Kontext gestartet. Ich habe es mittlerweile mit dem Standardprofil probiert, aber auch schon allen Benutzer ein modifiziertes Profil mit deaktiviertem OpenGL etc. verpasst. Hat aber keinen Unterschied gemacht. Der Effekt ist immer der gleiche, tritt aber nicht immer auf und kann auch nicht so einfach reproduziert werden. Auf jeden Fall bleibt bei allen Benutzern nach dem schließen von Writer der soffice.bin und soffice.exe Prozess hängen. Hat jemand irgendeine Idee wie ich dem Problem auf die Schliche kommen kann.

Antwort statt Kommentar wegen Textlänge

Hier noch der verwendete VB Code für die Nerds :slight_smile:
Aktuell setzen wir sie so ein, dass das Libreoffice Fenster nicht versteckt wird, da ich den Entwickler gebeten habe dies heraus zu nehmen, da ich annahm dass dies ggfs. die Fehlerquelle ist.


Dim oDokument As Object
Dim oDesktop As Object
Private Sub ZuerstPfadZurDatei(sPfad, bVersteckt As Boolean)
'aendern des Windowspfad in openoffice konformen pfad
'Para2: Ob das Open Office Dokument sichtbar = false oder unsichtbar = true geoeffnet werden soll

Dim arrEinstell(0)

sPfad = Replace(sPfad, "\", "/")
sPfad = Replace(sPfad, ":", "|")
sPfad = Replace(sPfad, " ", "%20")
sPfad = "file:///" + sPfad
'unter dem oDesktop werden alle auf der Sitzung/dem Rechner geoeffnete Dokumente abgelegt (container objekt fuer oo)
Set oDesktop = CreateOpenOfficeService("com.sun.star.frame.Desktop")
'den Parameter vorbereiten fuers sichtbar/unsichtbar oeffnen
Set arrEinstell(0) = MakePropertyValue("Hidden", bVersteckt)
'Dokument oeffnen
Set oDokument = oDesktop.loadComponentFromURL(sPfad, "_blank", 0, arrEinstell)
    
End Sub

Private Function MakePropertyValue(cName, uValue) As Object
Dim oStruct, oServiceManager As Object
Set oServiceManager = CreateObject("com.sun.star.ServiceManager")
Set oStruct = oServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
oStruct.Name = cName
oStruct.Value = uValue
Set MakePropertyValue = oStruct
End Function

Private Function CreateOpenOfficeService(sServiceName) As Object
'Mithilfe des Open Office Service Managers einen Service generieren und zurueckgeben
Dim oServiceManager As Object
Set oServiceManager = CreateObject("com.sun.star.ServiceManager")
Set CreateOpenOfficeService = oServiceManager.createInstance(sServiceName)

End Function


Public Function Ersetze(sSuchenNach As String, sErsetzenDurch As String, Optional sPfad) As Boolean
'Zuerst muss die Sub: ZuerstPfadZurDatei mit dem Pfad gefuettert sein
'Para1: Der String nachdem gesucht werden soll
'Para2: Der String der zum ersetzen verwendet werden soll
Dim bRueckgabe As Boolean
Dim oErsetzen As Object

If Not IsMissing(sPfad) Then
  If VarType(sPfad) = vbString Then
    If Not Trim(sPfad) = "" Then
        Call ZuerstPfadZurDatei(sPfad, True)
    End If
  Else
    Call ZuletztWiederSichtbar
  End If
End If
Set oErsetzen = oDokument.createReplaceDescriptor
oErsetzen.setSearchString (sSuchenNach)
oErsetzen.setReplaceString (sErsetzenDurch)
bRueckgabe = oDokument.replaceAll(oErsetzen)


End Function


Private Sub ZuletztWiederSichtbar()
'Para2: Nach dem letzten Suchen und Ersetzen waere es sinnvoll das Dokument sichtbar zu machen
Dim oFrame As Object
Dim oWindow As Object

'Das eventuelle wieder sichtbar machen des dokuments
Set oFrame = oDokument.getCurrentController.getFrame
Set oWindow = oFrame.getContainerWindow
oWindow.setVisible (True)

End Sub

Public Sub ZuletztOderDokZumachen()
'Ob das Open Office Dokument nach dem Suchen und ersetzen wieder geschlossen werden soll
oDokument.Close (True)
End Sub

Private Sub Class_Terminate()
Set oDokument = Nothing
End Sub