Come faccio a riconnettere a OpenOffice.org una volta che è stato chiuso?
-
21-09-2019 - |
Domanda
Ecco un'applicazione di esempio che crea una finestra con un solo pulsante all'interno. Quando si fa clic, si connette a OOo (se non è già collegato) e crea un documento di testo.
Questo funziona bene a meno che tutti i documenti creati in OOo sono chiusi. Poi, ho un DisposedException quando si cerca di creare il grafico successivo. Questo è comprensibile, ma OOo è stato chiuso. Tuttavia, cercando di riconnettere a questo punto mi dà un segmentation fault. C'è un modo migliore per ricollegare? Sto lavorando su Linux (Ubuntu).
Nota: Questo si collega correttamente a OOo, anche se OOo non è aperto. E 'una volta che OOo è stato aperto con l'applicazione, poi chiuse che si ottiene l'errore.
Tutto ciò che ha realmente bisogno di guardare è il metodo Connect. Ho appena avvolto in un'interfaccia Gtk per un facile test.
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]);
}
}
}
Soluzione
Non sono mai stato in grado di capire questo, ma ho trovato un modo per incidere intorno ad esso:
Ho creato un eseguibile separato per fare la generazione. La mia domanda principale quindi chiama questo eseguibile, passando i parametri necessari (solo un percorso del file da generare da, e la modalità per generare in).
Poiché l'arresto avviene solo se OOo è stato chiuso dall'avvio dell'applicazione corrente (e generato almeno un grafico), questo evita l'intera questione. E 'un brutto hack, ma ottiene il lavoro fatto.