Der Java-Error kommt ja davon, dass LO nicht beendet, sondern terminiert wird. Daher auch mein Gedanke das über die uno-Bridge zu machen - funktioniert dann auch:
Code: Alles auswählen
Sub Close_and_Shutdown()
'On Error Resume Next
Dim oDispatchProvider as Object
oDispatchProvider = ThisComponent.getCurrentController().getFrame()
Dim oDispatchHelper as Object
oDispatchHelper = CreateUnoService("com.sun.star.frame.DispatchHelper")
oDispatchHelper.executeDispatch(oDispatchProvider,_
".uno:Quit",_
"_self",_
com.sun.star.frame.FrameSearchFlag.ALL,Array())
'zum Herunterfahren bitte das Wiki befragen: http://wiki.ubuntuusers.de/Herunterfahren
'shell("sh sd_scrpt",0,,false)
'shell("gnome-session-quit --power-off",0,,false)
End Sub
Was nicht funktioniert, ist das Schließen von Frames die .close nicht unterstützen - da kommt ein uno-Fehler, den man in Basic nicht abfangen kann (oder evtl. doch über einen Listener auf den DispatchHelper?). Ob das für Dich reicht weiß ich nicht.
Die Reihenfolge der Befehle im Makro hat mit dem Schnellstarter zu tun. Der ist - wenn er aktiv ist - ja noch als Prozess am Laufen, daher kann der shell-Befehl nach dem Quit noch auf die LO-Infrastruktur zugreifen - wenn nicht, ist der .terminate-Befehl (oder das Quit im Makro oben) der letzte Ausführbare.
Bekomme ich an der Stelle "Call oDocument.Close(True)" die Fehlermeldung:
"call" sucht nach einer Funktion/Sub, oDocument ist aber eine Variable - lass' das call einfach weg, dann funktioniert's.
Makro "außerhalb" speichern:
unter Extras/Makros/Makros verwalten/LibreOffice Basic auf die Buttons:
"Verwalten", dann auf "Neu" klicken und eine neue Bibliothek anlegen - in der dann das Makro speichern. Diese Bibliothek kann dann als "Bibliothek" oder als "Extension" exportiert werden (Button "Exportieren") es wird dann (bei "Extension") eine *.oxt-Datei erstellt, die man über den Extension Manager (Extras/Extension Manager) importieren kann. Wenn man in einer Umgebung mit mehreren Usern immer mal wieder das eine oder andere Makro ergänzen/umschreiben muss, ist das ein 1a Weg um die Makros einer Anwendung zu pflegen, denn eine Extension (Bib_Version_1.oxt) über den Extension Manager gegen Bib_Version_2.oxt auszutauschen das schafft fast jeder User.

- neue_bibliothek_anlegen.png (67.25 KiB) 5648 mal betrachtet
Wichtig ist, dass Extensions NICHT beim Start von LO geladen werden. Man muss also in das Startmakro einer Applikation diese Ladeprozedur einfügen, sonst werden die Makros dieser Bibliothek NICHT gefunden!:
Code: Alles auswählen
if not BasicLibraries.isLibraryLoaded("NameDerBibliothek") then BasicLibraries.loadLibrary( "NameDerBibliothek")