[geschlossen] Libreoffice per Makro aus AOO beenden

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Benutzeravatar
Faol
***
Beiträge: 76
Registriert: Di, 26.01.2016 21:18

[geschlossen] Libreoffice per Makro aus AOO beenden

Beitrag von Faol » Mi, 23.05.2018 11:42

Hallo,

wie der Titel bereits beschreibt, benötige ich ein AOO-Makro,
welches bei Ausführung Libreoffice ohne weitere Nachfrage beendet.

Eine Sicherheitsabfrage, damit geöffnete Dokumente noch gespeichert werden,
programmiere ich über eine MSGBox-Abfrage.

Vielen Dank

Gruß
Faol
Zuletzt geändert von Faol am Di, 29.05.2018 18:44, insgesamt 1-mal geändert.
⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒
Win.10 Prof. (x64) • AOO 4.1.5
⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐

Benutzeravatar
balu
********
Beiträge: 3649
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Libreoffice per Makro aus AOO beenden

Beitrag von balu » Mi, 23.05.2018 13:04

Mahlzeit Faol,

was Du da vor hast wird wahrscheinlich nicht so einfach gehen wie Du dir es erhoffst.

Ich hatte im Mai 2012 mal den Wunsch gehabt, auf die Dateien von einem anderen Office drauf zuzugreifen. Genauer gesagtt, zwischen LO und OO.o (wäre heute AOO). Um es kurz zu machen, es ging damals nicht. Und da sich LO Makro-Technisch sich doch schon mittlerweile stellenweise von AOO weiter entfernt hat, glaube ich auch kaum daran das es heute funktionieren könnte.

Theoretisch müsstest du aus AOO heraus eine DOS-Box aufrufen in der Du in einer kleinen Batch-Datei LO per Kill-Befehl gnadenlos beendest. Ist aber nur so ein Gedankenexperiment meinerseits.

Auch wenn es schon sehr lange her ist, hier mal der Link zu dem Thread:
ComponentWalker: OOo & LO gleichzeitig Dateien auslesen
Vielleicht kannst Du ja da ein paar Informationen für dich herausziehen. Schau dir dazu auch den von Stephan verlinkten Thread mal etwas genauer an.

Über eine Erfolgsmeldung deinerseits würden sich natürlich so einige freuen, inklusive mich. Auch wenn ich mich mit dem Thema seit dem nicht mehr wirklich auseinandersetzen musste.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D

Benutzeravatar
Faol
***
Beiträge: 76
Registriert: Di, 26.01.2016 21:18

Re: Libreoffice per Makro aus AOO beenden

Beitrag von Faol » Mi, 23.05.2018 19:49

Hallo balu,

vielen Dank für Deine Unterstüzung.

Habe im englischen Forum
nachfolgenden Code gefunden und etwas angepaßt.
Unter LIbreoffice 6.0.2.1 läuft der Code durch und LO terminiert sich selbst.
Unter AOO 4.1.5 terminiert sich auch, allerdings kommt am Schluß noch eine Fehlermeldung.
Irgendetwas mit Runtime-Error und soffice.exe. Konnte aber nicht schnell genug lesen.
Wie Du schon erwähnt hast, diverse Unterschiede zwischen LO und AOO.

Code: Alles auswählen

Sub xTerminate
      Dim oEnum
      Dim oDoc
      
      oEnum = StarDesktop.getComponents().createEnumeration()
    Do While oEnum.hasMoreElements()
       oDoc = oEnum.nextElement()
       If HasUnoInterfaces(oDoc, "com.sun.star.util.XCloseable") Then
       oDoc.setModified(False)
       oDoc.close(True)
      Else
       oDoc.dispose()
       End If
    Loop
    StarDesktop.Terminate()
End Sub
Nun befindet sich im Makro keinerlei Handle, um die jeweils andere Office-Suite unter Windows zu erfassen.
Wie beschrieben möchte ich mit AOO --- LO terminieren und umgekehrt.

Was der Blödsinn soll?
Nun ich möchte mir einen Makro-Dialog erstellen, um den LO- und AOO -USER-Ordner zu bearbeiten.
  1. Den AOO-User per Schaltfläche im Explorer anzeigen lassen
  2. Den LO-User per Schaltfläche im Explorer anzeigen lassen
  3. Ein Backup des USER-Ordners für AOO erstellen und den vorhandenen USER-Ordner löschen.
    Hier eine Auswahl nur Backup oder Backup und löschen.
  4. Ein Backup des USER-Ordners für LO erstellen und den vorhandenen USER-Ordner löschen.
    Hier eine Auswahl nur Backup oder Backup und löschen.
  5. Nach einer Neuinstallation von AOO, mit neuerstelltem USER, diverse Ordner und Dateien aus dem Backup zurück kopieren.
    Ggf. mit Auswahlmenü
  6. Nach einer Neuinstallation von LO, mit neuerstelltem USER, diverse Ordner und Dateien aus dem Backup zurück kopieren.
    Ggf. mit Auswahlmenü
  7. Im Fall eines Crashes von AOO, den USER-Ordner aus dem neuesten Backup restaurieren.
  8. Im Fall eines Crashes von LO, den USER-Ordner aus dem neuesten Backup restaurieren.
Also ich starte LO, dann meine Makro-Dialog und bearbeite den AOO-User-Ordner oder umgekehrt.
Von längerer Zeit habe ich mir eine Batch mit Auswahlmenü geschrieben, die mir allerdings nur einen Teil der
obengenannten wünsche erfüllt.
Mit der Batch kann ich den gewünschten User-Ordner per Auswahl im Explorer anzeigen lassen und
sichert den gewünschten USER-Ordner unter einem neuen Ordnernamen.

Code: Alles auswählen

REM Fuer den Backup-Ordner wird wie folgt ein neuer Ordnername generiert:
REM Praefix 		= User_
REM aktuelles Datum 	= 20180519
REM Unterstrich		= _
REM Zufallszahl		= Zufallszahl zwischen 10 und 1000
REM zusammengesetzt	= User_20180519_512
BackUpUSER.zip
(1.15 KiB) 34-mal heruntergeladen
Ja, ich habe auch Stephan's Beitrag, welcher sich mit diesem Thema beschäftigt gelesen.
Allerdings möchte ich nicht mit AutoIt arbeiten. Einerseits meckert mein Virenscanner
in Bezug auf AutoIt (was sicherlich abstellbar wäre), oberdrein möchte ich nicht noch ein Handbuch lesen
um eine neue Scriptsprache zu lernen.

Vielleicht weiß ja jemand, wie ich ein Windows-Handle per Starbasic steuern kann.
Also, LO ruft das AOO-Handle auf und beendet AOO.
Nur so kann ich den USER-Ordner von AOO bearbeiten.

Gruß
Faol
Zuletzt geändert von Faol am Sa, 02.06.2018 22:28, insgesamt 1-mal geändert.
⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒
Win.10 Prof. (x64) • AOO 4.1.5
⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐

Stephan
********
Beiträge: 10591
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Libreoffice per Makro aus AOO beenden

Beitrag von Stephan » Mi, 23.05.2018 21:46

Du kannst nicht ohne 'Verrenkungen' eines der beiden Programme vom Anderen aus mit Bordmitteln beenden weil die Prozess-Namen gleich sind und Du per StarBasic nicht an die Prozess-IDs herankommst.

AutoIT hatte ich in dem anderen Projekt eingesetzt, weil es etwas mehr Möglichkeiten (insbesondere Dialoge) bietet als der Windows Scripting Host (WSH) und weil mir da auch etwas 'Reserve' für Erweiterungen lieb war, denn die primäre Aufgabe wäre auch ohne die Möglichkeit von Dialogen mit Msgboxen lösbar gewesen.
Leider kann LO derzeitig auch nicht einmal mit dem WSH umgeheben, siehe:
viewtopic.php?f=18&t=69372
und meine Fehlermeldung:
https://bugs.documentfoundation.org/sho ... ?id=117739


Falls ich richtig verstehe das Batch zulässig ist, würde ich eine Batch hinterlegen, oder per Basic-Makro zur Laufzeit erstellen, die ALLE Prozesse soffice.exe beendet (mit taskkill https://www.softwareok.de/?seite=faq-Wi ... sole&faq=8) und dann selektiv LO und AOO separat startet, aber dabei ein hinterlegtes Makro mitstartet (das lässt sich als Parameter für soffice übergeben, es gibt Beispiele von mir hier im Forum), welches das jeweilige Benutzerverzeichnis ermittelt und diese Info in eine Textdatei schreibt, danach wieder alle soffice-Prozesse zumacht und letztendlich nun LO ODER AOO startet und beide Benutzerverzeichnisse aus der Textdatei ausliest und dann diese Info nutzt um die weiteren Aufgaben zu erledigen.
Ob das alles so läuft, muss man sehen.



Gruß
Stephan

Benutzeravatar
Faol
***
Beiträge: 76
Registriert: Di, 26.01.2016 21:18

Re: Libreoffice per Makro aus AOO beenden

Beitrag von Faol » Di, 29.05.2018 18:43

Hallo Stephan,
Stephan hat geschrieben:Du kannst nicht ohne 'Verrenkungen' eines der beiden Programme vom Anderen aus mit Bordmitteln beenden weil die Prozess-Namen gleich sind und Du per StarBasic nicht an die Prozess-IDs herankommst.
Es ist mir klar, das Starbasic nicht unmittlebar über diese Funktionen verfügt. Allerdings ist es möglich auf die Windows-API
von AOO oder LO zu zugreifen.
Siehe: Beispiel
Per "Declare" kan man auf die Windows -API zugreifen.
Damit wäre es sicherlich auch möglich die PID, HWND (Windows-Handler), etc. zu erfassen.
Stephan hat geschrieben:AutoIT hatte ich in dem anderen Projekt eingesetzt, weil
Ist ein interessanter Weg, jedoch für mich im Augenblick keine Option.
Stephan hat geschrieben:Leider kann LO derzeitig auch nicht einmal mit dem WSH umgeheben, siehe:

Code: Alles auswählen

OleService = CreateUnoService("com.sun.star.bridge.OleObjectFactory")
WSH = OleService.CreateInstance("MSScriptControl.ScriptControl")
LO hat anscheinend die API neu geordnet. Ich konnte aber auch keinerlei Hinweis finden,
wie "OleObjectFactory" instanziert werden muss.
Ich konnte kein: "MSScriptControl.ScriptControl" finden.
Auch über das Interface "com.sun.star.lang.XMultiServiceFactory" bin ich nicht weitergekommen oder ich habe etwas übersehen.
Stephan hat geschrieben:Falls ich richtig verstehe das Batch zulässig ist, würde ich eine Batch hinterlegen
Es steckt hinter meiner Anfrage kein kommerzielles Interesse. In erster Linie will ich das Programm für mich schreiben und somit ist auch eine Batch zulässig, bzw. habe ja schon eine Batch-Behelfslösung. Für den Fall das es zuverlässig funktioniert, stelle ich es auch gerne hier im Forum zur Verfügung. Meine Absicht ist es nicht, mit Dir um die Wette zu eifern; AutoIT vs. Starbasic.
Mit „old School“ Batches habe ich mir schon sehr verschiedenste Dinge automatisiert. Mein Ziel ist es nun, quasi alles (oder fast alles) unter einen Hut zupacken und nahezu zentral Aufgaben zum Thema Benutzer-Ordner über eine GUI (mit Optionen) zu automatisieren. Sichern und bei Versionswechsel gesicherten Ordner mit Bedingungen zurück kopieren. Die Grenze des Automatismus liegt aber bei dem automatischen Editieren von XML-Dateien, damit neue Funktionen erhalten bleiben, als auch meine benutzerdefinierten Funktionen erhalten bleiben.
Es schade, dass weder LO, noch AOO von Haus aus ein Tool zur USER-Ordner-Verwaltung mitbringen.
Also, selbst ist der Mann :-P
Stephan hat geschrieben:per Basic-Makro zur Laufzeit erstellen, die ALLE Prozesse soffice.exe beendet (mit taskkill https://www.softwareok.de/?seite=faq-Wi ... sole&faq=8) und dann selektiv LO und AOO separat startet...

Wie diesem Beitrag und weiteren zur Folge suchst auch Du eine Möglichkeit zur USER-Ordner-Verwaltung. Allerdings möchtest Du dieses auch für Mac und Linux programmieren.
Vom Mac habe ich leider keine Ahnung und Linux nur sehr wenig. Deshalb muss ich mich auf Windows beschränken.
Habe in den letzten Tage einen anderen Ansatz verfolgt, in dem ich mit einem C#-Programm die USER-Ordner-Verwaltung steuere.
Im Augenblick bin ich noch nicht soweit, als dass ich hier eine fertige Lösung vorstellen könnte.
Die IDE habe ich mir hier heruntergeladen: SharpDevelop.
Denkbar wäre es von C# auf JAVA zu wechseln. Dann könnte ggf. plattformübergreifend programmiert werden.

Ich setze diesen Thread auf "geschlossen" und stelle die Suche nach einer Starbasic Lösung ein.

Vielen Dank

Gruß
Faol
⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒
Win.10 Prof. (x64) • AOO 4.1.5
⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐

Stephan
********
Beiträge: 10591
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: [geschlossen] Libreoffice per Makro aus AOO beenden

Beitrag von Stephan » Di, 29.05.2018 19:20

Es ist mir klar, das Starbasic nicht unmittlebar über diese Funktionen verfügt.
Darum geht es mir garnicht.
Allerdings ist es möglich auf die Windows-API
von AOO oder LO zu zugreifen.
Damit kenne ich mich nicht aus, weswegern ich den WSH bevorzuge
Damit wäre es sicherlich auch möglich die PID, HWND (Windows-Handler), etc. zu erfassen.
WIE denn?

Meiner Meinung nach ist es nicht möglich bei zwei LAUFENDEN Prozessen deren Namen exakt gleich sind (=soffice) herauszukriegen Welcher Welcher ist.
Wohlgemerkt, selbst wenn ich eine beliebige Programmiersprache dazu nutzen darf, wüsste ich nicht wie ich das anstelle.

Das es 'irgendwie' doch gehen muss ist mir schon klar, denn der Taskmanager ist ja in der Lage von der jeweiligen Anwendung zum richtigen Prozess zuzuordnen, aber ich habe bisher noch nie einen Code gesehen (egal in welcher Programmiersprache) wie ich an diese Info komme. Alle Lösungen die ich kenne, gehen immer davon das das beide Programme bereits per Code kontrolliert gestartet werden müssen, weil man dann ja bei Start des ersten soffice-Prozesses die erste PID abfragen kann und weiß das nach Start des zweiten soffice-Prozesses die dann zweite PID zu eben jenem zweiten Prozesss gehört.
Mein Ziel ist es nun, quasi alles (oder fast alles) unter einen Hut zupacken und nahezu zentral Aufgaben zum Thema Benutzer-Ordner über eine GUI (mit Optionen) zu automatisieren.
Ja eben. Und dazu gabst Du zwei Infos: 'es soll kein AutoIT sein' und 'ich habe Erfahrungen mit Batchlösungen' und da ich nicht mehr als diese Infos hatte habe ich eine Lösung mit Batch vorgschlagen. Diese LÖsung musst Diu nicht mögen, nur was für Antworten erwartest Du bei den gegebenen Infos?

Wenn Du jetzt schreibst Du hättest nun begonnen das in C# zu machen ist das technisch prima, nur woher sollte ich denn bisher wissen das eine Lösung in C# überhaupt infrage kommt?
(ich meine nicht technisch, sondern meine für Dich, weil Du bereit wärest C# als Sprache benutzen zu wollen)
Falls Du hingegen von Anfang an eine Empfehlung für eine bestimmte Programmiersprache zur Problemlösung wolltest, so kann ich nur sagen das ich die Frage so nicht verstanden hatte.



Gruß
Stephan

Antworten