Question

Voici un exemple d'application qui crée une fenêtre avec un seul bouton à l'intérieur. Lorsque vous cliquez dessus, il se connecte à OOo (si pas déjà connecté) et crée un document texte.

Cela fonctionne bien à moins que tous les documents créés dans OOo sont fermés. Ensuite, je reçois un DisposedException en essayant de créer la liste suivante. Cela est compréhensible, mais OOo a été fermé. Cependant, en essayant de se reconnecter à ce point me donne une erreur de segmentation. Y at-il une meilleure façon de se reconnecter? Je travaille sur linux (Ubuntu).

Remarque: Cette connexion correctement à OOo, même si OOo n'est pas ouvert. Il est une fois OOo a été ouvert par l'application, puis fermé que nous obtenons l'erreur.

Tout ce que vous avez vraiment besoin de regarder est la méthode Connect. Je l'ai juste enveloppé dans une interface Gtk pour le test facile.

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]); 
      } 
   } 
}
Était-ce utile?

La solution

Je n'ai jamais pu comprendre cela, mais j'ai trouvé un moyen de pirater autour:

I créé un exécutable séparé pour faire la génération. Mon application principale appelle ensuite cet exécutable, en lui passant les paramètres nécessaires (juste un chemin vers le fichier pour générer à partir, et le mode de générer dans).

Depuis l'accident ne se produit que lorsque OOo est fermée depuis l'application a commencé à courir (et généré au moins un graphique), ce qui évite toute la question. Il est un hack très laid, mais il fait le travail.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top