Câu hỏi Giúp chẩn đoán vấn đề trong việc phát triển ứng dụng OpenOffice 4.1 tùy chỉnh bằng C ++ Ubuntu 14.04.01 Máy chủ LTS


Tôi tìm kiếm sự trợ giúp với phần "chung" của ứng dụng máy chủ bảng tính C ++ của chúng tôi kết nối với dịch vụ Open Office 4.1.2 không đầu.

Phần kết nối "chung" của ứng dụng này được thể hiện trong đoạn mã bên dưới. Chúng ta cần các tính năng XDesktop và XComponentLoader để làm việc nhưng chúng cho chúng ta vấn đề, ngay cả khi chạy độc lập.

Chúng ta có sử dụng các tính năng này một cách chính xác không? Làm thế nào để chúng tôi làm cho họ làm việc, hoặc một lựa chọn tốt hơn là gì?

Mã (OpenOffice example.cxx):

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <cppuhelper/bootstrap.hxx>
#include <com/sun/star/bridge/XUnoUrlResolver.hpp>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/lang/XMultiComponentFactory.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/frame/Desktop.hpp>
#include <com/sun/star/uno/XInterface.hpp>
#include <com/sun/star/frame/XComponentLoader.hpp>
#include <com/sun/star/container/XNameAccess.hpp>
#include <com/sun/star/document/XTypeDetection.hpp>

using namespace com::sun::star::uno;
using namespace com::sun::star::lang;
using namespace com::sun::star::bridge;
using namespace com::sun::star::beans;
using namespace com::sun::star::frame;
using namespace com::sun::star::container;
using namespace com::sun::star::document;
using namespace rtl;
using namespace cppu;

#define DIAG(s) printf("%s\n",s)
#define OOCHECKREF(x) if (!x.is()){printf("Error: "#x"\n");return 1;}

int main (int argc, char *argv[]) {
   try {
     DIAG("mComponentContext");
     Reference< XComponentContext > mComponentContext
         = defaultBootstrap_InitialComponentContext();

     DIAG("mServiceManager");
     Reference< XMultiComponentFactory > mServiceManager
         = mComponentContext->getServiceManager();

     DIAG("rResolverInstance");
     Reference< XInterface > rResolverInstance
         = mServiceManager->createInstanceWithContext (
             OUString::createFromAscii(
                 "com.sun.star.bridge.UnoUrlResolver") ,
     mComponentContext);

     DIAG("rResolver");
     Reference< XUnoUrlResolver > rResolver (rResolverInstance,
                                             UNO_QUERY);
     OOCHECKREF(rResolver)

     DIAG("rOfficeInstance");    
     Reference< XInterface > rOfficeInstance
         = rResolver->resolve (
             OUString::createFromAscii
                ("uno:socket,host=localhost,port=8199;    
                       urp;StarOffice.ServiceManager")) ;
     OOCHECKREF(rOfficeInstance)

     DIAG("rOfficeServiceManager");
     Reference< XMultiServiceFactory > rOfficeServiceManager (
         rOfficeInstance, UNO_QUERY);
     OOCHECKREF(rOfficeServiceManager)

     DIAG("xPropSet");
     Reference< XPropertySet > xPropSet (rOfficeInstance, UNO_QUERY) ;
     xPropSet->getPropertyValue (
          OUString::createFromAscii("DefaultContext")) 
             >>= mComponentContext;

     DIAG("xMultiComponentFactoryServer");
     Reference< XMultiComponentFactory > xMultiComponentFactoryServer(
         mComponentContext->getServiceManager());

     DIAG("rDesktop");
     Reference<XInterface> rDesktop 
         = rOfficeServiceManager->createInstance(
             OUString::createFromAscii("com.sun.star.frame.Desktop"));
     OOCHECKREF(rDesktop)

     DIAG("mComponentLoader");
     Reference< XComponentLoader > mComponentLoader (rDesktop,  
                                                     UNO_QUERY);
     OOCHECKREF(mComponentLoader)

     DIAG("rFiltersInt");
     Reference< XInterface > rFiltersInt 
         = rOfficeServiceManager->createInstance(
             OUString::createFromAscii(
                 "com.sun.star.document.FilterFactory"));
     OOCHECKREF(rFiltersInt)

     DIAG("mFilterFactory");
     Reference<XNameAccess> mFilterFactory
         = Reference< XNameAccess (rFiltersInt, UNO_QUERY);
     OOCHECKREF(mFilterFactory)

     DIAG("rTypeDetectInt");
     Reference< XInterface > rTypeDetectInt 
         = rOfficeServiceManager->createInstance(
            OUString::createFromAscii(
                "com.sun.star.document.TypeDetection"));
     OOCHECKREF(rTypeDetectInt)

     DIAG("mTypeDetect");
     Reference< XTypeDetection > mTypeDetect 
         = Reference< XTypeDetection  (rTypeDetectInt, UNO_QUERY);
     OOCHECKREF(mTypeDetect)

     DIAG ("Connected successfully to the office - press enter to exit");
     getchar();
   } catch (Exception &e) {
     OString o = OUStringToOString (e.Message,   
                                    RTL_TEXTENCODING_ASCII_US);
     printf ("Error: %s\n", o.pData->buffer);
     return 1;
  }
  return 0;
}

Các vấn đề là gì?

Mã dưới đây biên dịch, chạy và kết nối nhưng seg-lỗi sau khi nhấn phím cuối cùng (sau getchar ()):

gdb ../../../LINUXexample.out/bin/ooexample
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ../../../LINUXexample.out/bin/ooexample...(no debugging symbols found)...done.
(gdb) r
Starting program: /opt/libreoffice5.2/sdk/LINUXexample.out/bin/ooexample
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
mComponentContext
[New Thread 0x7ffff5988700 (LWP 12125)]
mServiceManager
rResolverInstance
rResolver
rOfficeInstance
[New Thread 0x7ffff4015700 (LWP 12128)]
[New Thread 0x7ffff3814700 (LWP 12129)]
rOfficeServiceManager
xPropSet
xMultiComponentFactoryServer
rDesktop
mComponentLoader
rFiltersInt
mFilterFactory
rTypeDetectInt
mTypeDetect
Connected successfully to the office - press enter to exit

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff489b723 in cpp_vtable_call ()
   from /opt/libreoffice5.2/program/libgcc3_uno.so
(gdb) bt
#0  0x00007ffff489b723 in cpp_vtable_call ()
   from /opt/libreoffice5.2/program/libgcc3_uno.so
#1  0x00007ffff48a26ea in privateSnippetExecutor ()
   from /opt/libreoffice5.2/program/libgcc3_uno.so
#2  0x0000000000401ea9 in main ()
(gdb) c
Continuing.
[Thread 0x7ffff7fc8780 (LWP 11222) exited]
[Thread 0x7ffff4015700 (LWP 11229) exited]
[Thread 0x7ffff5988700 (LWP 11226) exited]

Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.

Tại sao lại là XDesktop và XComponentLoader?

Chúng tôi thấy rằng các cuộc gọi trên API bảng tính dường như không hoạt động mà không cần phải gọi trước các tính năng này, như trong mẫu mã. Mã tương tự được nhúng trong ứng dụng đầy đủ, cũng như một ví dụ tương tự, cả hai đều thất bại trong cuộc gọi XComponentLoader (backtrace chấm dứt trên dòng đó). Do đó, chúng tôi nghi ngờ có vấn đề với XComponentLoader.

Chúng tôi đã thử điều này với SDK Libreoffice 4 (theo repo đáng tin cậy của ubuntu), Libreoffice 5.2 SDK và Openoffice 4.1.2 SDK, với kết quả giống hệt nhau.

Chúng ta đã làm theo những ví dụ nào?

Đầu tiên chúng tôi bắt đầu https://wiki.openoffice.org/wiki/Documentation/DevGuide/ProUNO/C%2B%2B/Establishing_Interprocess_Communications, sau đó thêm các tham chiếu XDesktop và XComponentLoader bằng cách sử dụng một hóa thân trước đó của mã ứng dụng của chúng tôi. (Hóa thân trước đó không thành công ở giai đoạn bootstrap, sử dụng lệnh cppu :: createSimpleRegistry đã loại bỏ dần dần dẫn đến phá thai chương trình, xem https://docs.libreoffice.org/cppuhelper/html/compat_8cxx_source.html, dòng 80+). Như đã nhận xét, hãy chạy đoạn mã trên trong toàn bộ các lỗi seg-ứng dụng ở giai đoạn XComponentLoader.

Ví dụ "tương tự" được gọi là từ www.linuxjournals.com/article/8608#. Thực hiện seg-lỗi tại cuộc gọi xComponentLoader-> loadComponentFromURL (backtrace chấm dứt trên dòng đó; các tham số tệp và thư mục được truyền vào phương thức đó có vẻ tốt trên kiểm tra; cờ là 0, chuỗi thuộc tính bị vô hiệu).


2
2017-09-20 14:07


gốc


"họ đang cho chúng ta những vấn đề" - Loại vấn đề gì? Vui lòng bao gồm thông báo lỗi và mô tả khi nào nó xảy ra. Ngoài ra, nó sẽ giúp bao gồm một liên kết đến tài liệu hoặc ví dụ mà bạn đã cố gắng làm theo. Có lẽ wiki.openoffice.org/wiki/UNO_registery_and_Bootstrapping? - Jim K
Cảm ơn vì phản hồi kịp thời của bạn. Tôi đã cố làm rõ câu hỏi. - hamish
Có vẻ như bạn cần đóng kết nối đúng cách, như được hiển thị trong danh sách 7 tại linuxjournal.com/article/8608. - Jim K


Các câu trả lời: