1
這裏是一個示例應用程序,它創建一個帶有單個按鈕的窗口。點擊後,它連接到OOo(如果尚未連接)並創建一個文本文檔。如何在OpenOffice.org關閉後重新連接到OpenOffice.org?
這工作正常,除非在OOo中創建的所有文檔都關閉。然後,當我嘗試創建下一個圖表時,我得到一個DisposedException。這是可以理解的,但是OOo已經關閉了。但是,嘗試重新連接在這一點上給我一個段錯誤。有沒有更好的方法來重新連接?我正在研究Linux(Ubuntu)。
注意:即使OOo未打開,也可以正確連接到OOo。一旦OOo被應用程序打開,然後關閉,我們得到錯誤。
你真正需要看的是Connect方法。我只是將它包裝在一個Gtk界面中以便於測試。
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]);
}
}
}
這可能是一個愚蠢的問題,但是當你關閉所有的文檔後,你有沒有完全退出? – 2009-11-25 02:39:18
我確實(從我不使用Quickstarter或其他任何東西的意義上說)。但是,我注意到關閉文檔時,「disposed」信號沒有被調用componentContext,multiServiceFactory或loader。只有「文件」纔會調用已處理的信號。 – 2009-11-26 02:00:56