2009-11-23 17 views
1

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 (s'il n'est pas déjà connecté) et crée un document texte.Comment me reconnecter à OpenOffice.org une fois qu'il a été fermé?

Cela fonctionne correctement, sauf si tous les documents créés dans OOo sont fermés. Ensuite, j'obtiens une exception DisposedException en essayant de créer le graphique suivant. C'est compréhensible, mais OOo a été fermé. Cependant, essayer de me reconnecter à ce moment-là me donne une erreur de segmentation. Y a-t-il un meilleur moyen de se reconnecter? Je travaille sur Linux (Ubuntu).

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

Tout ce que vous devez vraiment regarder est la méthode Connect. Je l'ai juste enveloppé dans une interface Gtk pour un 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]); 
     } 
    } 
} 
+0

Ceci est probablement une question stupide, mais avez-vous la configuration OOo pour quitter complètement une fois tous les documents sont fermés? –

+0

Je fais (dans le sens où je n'utilise pas le Quickstarter ou quoi que ce soit). Cependant, j'ai remarqué que le signal "disposé" n'est pas appelé pour componentContext, multiServiceFactory ou loader lorsque je ferme le document. Seul le "document" appelle le signal éliminé. –

Répondre

1

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

J'ai créé un exécutable distinct pour faire la production. Mon application principale appelle alors cet exécutable en lui transmettant les paramètres nécessaires (juste un chemin vers le fichier à générer, et le mode de génération).

Étant donné que le blocage se produit uniquement lorsque OOo a été fermé depuis le démarrage de l'application (et qu'il a généré au moins un graphique), cela évite l'ensemble du problème. C'est un hack très moche, mais ça fait le boulot.