Connection schließen

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

Moderator: Moderatoren

mipa
*
Beiträge: 10
Registriert: So, 21.01.2007 17:54

Connection schließen

Beitrag von mipa »

Hallo,

ich habe ein Problem beim Schließen der Connection zu OpenOffice. Ich möchte ein Writer-Dokument öffnen, evtl. bearbeiten und dann alles schließen. In der Oberfläche klappt es auch soweit, aber im Task-Manager bleiben die Prozesse soffice.exe und soffice.bin weiterhin bestehen. Erst wenn ich den Writer einmal manuell schließe, verschwinden die Prozesse.

Es würde ja auch nicht weiter stören, wenn der Prozess soffice.bin nicht immer weiter Speicher saugen würde, wenn ich ein neues Dokument öffne.

Ich schließe die Verbindung wohl nicht richtig. Kann mir jemand helfen?

Code: Alles auswählen

	private XComponentLoader componentLoader = null;
	private XComponentContext remoteContext = null;
	private XMultiComponentFactory remoteServiceManager = null;

	public void testConnection() throws java.lang.Exception {

		// Connection herstellen
		XComponentLoader connection = openConnection();

		// Dokument öffnen
		PropertyValue loadProps[] = new PropertyValue[1];
		loadProps[0] = new com.sun.star.beans.PropertyValue();
		XComponent component = connection.loadComponentFromURL(
				"file:///D:/temp/Test.ott", "_blank", 0, loadProps);

		// Dokument schliessen
		closeDocument(component);

		// Connection schließen
		connection = null;
	}

	private XComponentLoader openConnection() throws java.lang.Exception {

		if (this.remoteContext == null && this.remoteServiceManager == null) {
			// get the remote office context. If necessary a new office
			// process is started
			try {
				this.remoteContext = com.sun.star.comp.helper.Bootstrap
						.bootstrap();
				System.out.println("Connected to a running office ...");
				this.remoteServiceManager = this.remoteContext
						.getServiceManager();

			} catch (java.lang.Exception ex) {
				log.error("Fehler beim Connect to OpenOffice!", ex);
			}
		}

		// retrieve the Desktop object, we need its XComponentLoader
		Object desktop = this.remoteServiceManager.createInstanceWithContext(
				"com.sun.star.frame.Desktop", this.remoteContext);

		this.componentLoader = (XComponentLoader) UnoRuntime.queryInterface(
				XComponentLoader.class, desktop);

		return this.componentLoader;
	}

	private void closeDocument(XComponent component) throws java.lang.Exception {
		XModel model = (XModel) UnoRuntime.queryInterface(XModel.class,
				component);

		if (model != null) {
			XCloseable xClosable = (XCloseable) UnoRuntime.queryInterface(
					XCloseable.class, model);
			int k = 0;
			if (xClosable != null) {
				while (k < 100 && xClosable != null) {
					try {
						xClosable.close(true);
						xClosable = null;
					} catch (com.sun.star.util.CloseVetoException exCloseVeto) {
						System.out.println(exCloseVeto.toString());
						Thread.sleep(1000);
						k++;
					}
				}
			} else {
				XComponent disposable = (XComponent) UnoRuntime.queryInterface(
						XComponent.class, model);
				disposable.dispose();
			}
		}
	}
Danke und Gruß, Michaela
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Michaela,

Das Verhalten ist an sich "normal". Die beiden Prozesse bleiben in der Regel im Hintergrund bestehen, solange noch irgendeine Instanz von OOo läuft, und das ist meist der Schnellstarter.
Wenn ich das richtig entziffere, dann schliessst du zwar das Dokument, das jedoch ist ja nur Teil des Frameworks - des StarDesktops. Ich denke, wenn du alles weg haben willst, musst du den entfernen. Wahrscheinlich mit "dispose", aber da must du noch mal nachschlagen :-)

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
hol.sten
******
Beiträge: 871
Registriert: Fr, 18.11.2005 21:21

Beitrag von hol.sten »

Toxitom hat geschrieben:Wenn ich das richtig entziffere, dann schliessst du zwar das Dokument, das jedoch ist ja nur Teil des Frameworks - des StarDesktops. Ich denke, wenn du alles weg haben willst, musst du den entfernen. Wahrscheinlich mit "dispose"
Ich mache es so:

Code: Alles auswählen

Object desktop = remoteContext.getServiceManager().createInstanceWithContext("com.sun.star.frame.Desktop",xRemoteContext);
XDesktop xDesktop = (XDesktop) OpenOfficeFacade.queryUNOInterface(XDesktop.class, desktop);
xDesktop.terminate();
Regards
hol.sten
mipa
*
Beiträge: 10
Registriert: So, 21.01.2007 17:54

Beitrag von mipa »

Und es klappt!
Danke :lol:
AlemannenLady
*
Beiträge: 14
Registriert: Do, 25.01.2007 15:37

Package

Beitrag von AlemannenLady »

welches Package benutzt ihr? Ich hatte bisher nur Probleme mit den XComponent und PropertyValues. Bin jedoch auch nicht sehr bewandert auf diesem Gebiet.
Wenn man das NOA Package nimmt geht es auch so:
officeApp.getDesktopService().terminate();

Ciao
mipa
*
Beiträge: 10
Registriert: So, 21.01.2007 17:54

Re: Package

Beitrag von mipa »

Das NAO Package kenne ich nun gar nicht
Alles, was ich benutze steht im oben abgebildeten Code.
hol.sten
******
Beiträge: 871
Registriert: Fr, 18.11.2005 21:21

Re: Package

Beitrag von hol.sten »

AlemannenLady hat geschrieben:welches Package benutzt ihr?
Die JAR Dateien aus dem OOo Installationsverzeichnis.
AlemannenLady hat geschrieben:Ich hatte bisher nur Probleme mit den XComponent und PropertyValues.
Aha, und welche?
AlemannenLady hat geschrieben:Wenn man das NOA Package nimmt
Kenne ich auch nicht.

Regards
hol.sten
AlemannenLady
*
Beiträge: 14
Registriert: Do, 25.01.2007 15:37

okay... :)

Beitrag von AlemannenLady »

...das macht natürlich Sinn! :oops: ich habe zuvor noch nie mit OpenOffice gearbeitet, daher habe ich sofort nach UNO packages gesucht. Da hatte ich nur die Auswahl zwischen dem Noa und dem Uno Wrapper (kostenpflichtig) von Riess. Hat zwar auch wunderbar geklappt, aber wenn ich mal was ändern wollte und funktionierte nicht, habe ich immer nur die Beispiele mit dem X davor gefunden.
Ich hab daraufhin schon den Code geändert und die fehlenden Packages auch importiert. Aber er wollte das trotzdem nicht anerkennen und ihm waren z.B. PropertyValue unbekannt.
hol.sten
******
Beiträge: 871
Registriert: Fr, 18.11.2005 21:21

Re: okay... :)

Beitrag von hol.sten »

AlemannenLady hat geschrieben:Ich hab daraufhin schon den Code geändert und die fehlenden Packages auch importiert. Aber er wollte das trotzdem nicht anerkennen und ihm waren z.B. PropertyValue unbekannt.
Dann hat das Jar-File "ridl.jar" in deinem CLASSPATH gefehlt. Öffne einfach mal "ridl.jar" mit einem ZIP-Programm. Dann wirst du dort im Unterverzeichnis com/sun/star/beans das Class-File "PropertyValue.class" finden. Die JAR-Files von OOo findest du in deinem OOo Installations-Verzeichnis im Unterverzeichnis "program/classes". Unter Windows bei einer Standard-Installation von OOo 2.1 also z. B. im Verzeichnis "C:\Program Files\OpenOffice.org 2.1\program\classes".

Regards
hol.sten
AlemannenLady
*
Beiträge: 14
Registriert: Do, 25.01.2007 15:37

yepp

Beitrag von AlemannenLady »

Danke, das war der Fehler! :)
Antworten