2009-11-23 55 views
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]); 
     } 
    } 
} 
+0

這可能是一個愚蠢的問題,但是當你關閉所有的文檔後,你有沒有完全退出? – 2009-11-25 02:39:18

+0

我確實(從我不使用Quickstarter或其他任何東西的意義上說)。但是,我注意到關閉文檔時,「disposed」信號沒有被調用componentContext,multiServiceFactory或loader。只有「文件」纔會調用已處理的信號。 – 2009-11-26 02:00:56

回答

1

我從來沒有能夠弄清楚這一點,但我沒有找到一個方法來破解它周圍:

我創建了一個單獨的可執行文件做發電。然後,我的主應用程序調用這個可執行文件,並將它傳遞給必要的參數(只是生成文件的路徑,以及生成的模式)。

由於碰撞,只有當自應用程序啓動運行OOo的已關閉(和產生至少一個圖表)時,這避免了整個問題。這是一個非常醜陋的黑客,但它完成了工作。

相關問題