Frage

Hier ist eine Beispielanwendung, die ein Fenster mit einem einzigen Knopf im Innern schafft. Wenn Sie darauf klicken, wird eine Verbindung zu OOo (falls nicht bereits angeschlossen ist) und erzeugt ein Textdokument.

Das funktioniert gut, wenn alle in OOo erstellten Dokumente geschlossen sind. Dann bekomme ich einen DisposedException beim Versuch, die folgende Tabelle zu erstellen. Das ist verständlich, aber OOo geschlossen wurde. Doch an diesem Punkt wieder zu verbinden versuchen, gibt mir ein segfault. Gibt es eine bessere Art und Weise zu verbinden? Ich arbeite unter Linux (Ubuntu).

Hinweis: Verbindet richtig OOo selbst wenn OOo nicht geöffnet ist. Es ist einmal OOo wird von der Anwendung geöffnet, dann geschlossen, dass wir den Fehler.

Alles, was Sie wirklich brauchen, zu betrachten ist die Methode Connect. Ich wickelte es nur in einer Gtk-Schnittstelle für einfache Tests.

using System; 
using unoidl.com.sun.star.uno; 
using unoidl.com.sun.star.lang; 
using unoidl.com.sun.star.text; 
using unoidl.com.sun.star.frame; 
using unoidl.com.sun.star.beans; 
using Gtk; 

namespace TestOOo { 
   class MainClass { 
      static XComponentContext componentContext; 
      static XMultiServiceFactory multiServiceFactory; 
      static XComponentLoader loader; 
      static XTextDocument document; 

      public static void Main (string[] args) 
      { 
         Application.Init(); 

         Window mainWindow = new Window("Test Window"); 
         mainWindow.Visible = true; 
         mainWindow.Destroyed += delegate { Application.Quit(); }; 
         Button button = new Button(Stock.Ok); 
         button.Clicked += delegate { Connect(); }; 
         mainWindow.Add(button); 
         mainWindow.ShowAll(); 

         Application.Run(); 
      } 

      static void Connect() 
      { 
         // Connect to OOo 
         if (componentContext == null) 
            componentContext = uno.util.Bootstrap.bootstrap(); 

         try { 
            multiServiceFactory = 
               (XMultiServiceFactory) componentContext.getServiceManager(); 
         } catch { 
            // This is where we want to reconnect, but trying to 
            // bootstrap() again segfaults. 

            // componentContext = uno.util.Bootstrap.bootstrap(); 
            // multiServiceFactory = 
            //   (XMultiServiceFactory) componentContext.getServiceManager(); 
         } 

         loader = (XComponentLoader) 
            multiServiceFactory.createInstance("com.sun.star.frame.Desktop"); 
         document = (XTextDocument) loader.loadComponentFromURL 
            ("private:factory/swriter", "_blank", 0, new PropertyValue[0]); 
      } 
   } 
}
War es hilfreich?

Lösung

ich war nie in der Lage dieses, um herauszufinden, aber ich habe einen Weg finden, zu hacken um es:

Ich habe ein separates Programm die Generierung zu tun. Meine Hauptanwendung ruft dann diese ausführbare Datei, die notwendigen Parameter (nur einen Pfad zu der Datei aus zu erzeugen und um den Modus zu erzeugen in) übergeben.

Da nur der Absturz tritt auf, wenn OOo geschlossen wurde seit dem Start der Anwendung ausgeführt wird (und mindestens ein Diagramm erzeugt), vermeidet dies das ganze Problem. Es ist eine sehr hässliche Hack, aber es bekommt den Job zu erledigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top