Проблема Диагностирования справки в Разработке Пользовательского приложения OpenOffice 4.1 с помощью C++ Ubuntu 14.04.01 сервер LTS

Я обращаюсь за помощью с "универсальной" частью нашего приложения для сервера электронной таблицы C++, которое соединяется с бездисплейным, Открывают Office 4.1.2 сервиса.

"Универсальная" часть соединения этого приложения представлена во фрагменте кода ниже. Нам действительно нужны функции XDesktop и XComponentLoader для работы, но они дают нам проблемы, даже когда выполнено автономные.

Мы используем это функции правильно? Как мы заставляем их работать, или что лучшее альтернативно?

Код (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;
}

Каковы были проблемы?

Код ниже компиляций, выполнений и подключений, но seg-отказов после заключительного нажатия клавиши (после 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.

Почему XDesktop и XComponentLoader в особенности?

Мы находим, что обращается к API электронной таблицы, кажется, не работают без предшествующего вызова этих функций, как в примере кода. Тот же код, встроенный в полном приложении, а также несколько подобном примере, обоих сбоях на вызове XComponentLoader (след, завершающийся на той строке). Мы поэтому подозреваем проблему с XComponentLoader.

Мы попробовали это Libreoffice 4 SDK (согласно надежному человеку человечности repo), Libreoffice 5.2 SDK и Openoffice 4.1.2 SDK, с идентичными результатами.

Каким примерам мы следовали?

Сначала мы запустили в https://wiki.openoffice.org/wiki/Documentation/DevGuide/ProUNO/C%2B%2B/Establishing_Interprocess_Communications, затем добавив XDesktop и ссылки XComponentLoader с помощью предыдущего воплощения нашего кода приложения. (Это предыдущее воплощение перестало работать на этапе начальной загрузки, который использовал постепенно сокращенный cppu:: вызов createSimpleRegistry, который теперь приводит к прерыванию программы, видит https://docs.libreoffice.org/cppuhelper/html/compat_8cxx_source.html, строки 80 +). Как отмечено, выполнение вышеупомянутого кода в полном приложении seg-дает-сбой на этапе XComponentLoader.

"Подобный" упомянутый пример из www.linuxjournals.com/article/8608#. Выполнение seg-дает-сбой в xComponentLoader-> loadComponentFromURL вызов (след, завершающийся на той строке; файл и параметры каталога передали в тот взгляд метода, хороший на контроле; флаг 0, последовательность свойства является пустой).

2
задан 21 September 2016 в 13:40

0 ответов

Другие вопросы по тегам:

Похожие вопросы: