1

これは、単一のボタンを内部に持つウィンドウを作成するサンプル アプリケーションです。クリックすると、OOo に接続され (まだ接続されていない場合)、テキスト ドキュメントが作成されます。

OOo で作成されたすべてのドキュメントが閉じられていない限り、これは正常に機能します。次に、次のチャートを作成しようとすると DisposedException が発生します。これは理解できますが、OOo は閉鎖されました。ただし、この時点で再接続しようとすると、segfault が発生します。再接続する良い方法はありますか? 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]); 
      } 
   } 
}
4

1 に答える 1

1

これを理解することはできませんでしたが、ハッキングする方法を見つけました:

生成を行うために別の実行可能ファイルを作成しました。次に、メイン アプリケーションがこの実行可能ファイルを呼び出し、必要なパラメーター (生成元のファイルへのパスと、生成するモード) を渡します。

クラッシュは、アプリケーションが実行を開始してから (そして少なくとも 1 つのグラフが生成されてから) OOo が閉じられたときにのみ発生するため、これにより問題全体が回避されます。これは非常に醜いハックですが、仕事は完了します。

于 2010-01-28T18:48:46.697 に答える