FreePascal и OpenOffice

Библиотеки для работы с офисными пакетами (OpenOffice, MS Office и т.п.)

Модератор: Модераторы

Re: FreePascal и OpenOffice

Сообщение Okoshkin » 26.05.2008 16:09:20

Nashev писал(а):Как же вы без английского такую штуку осилили? снимаю шляпу.

В общем, хотелось бы чтоб программа, сделанная с вашей библиотекой ради возможности общения с OpenOffice могла б, когда опен-офиса нету, продолжать работать, просто выключив соответствующие функции. Для этого статическую линковку надо убрать.

Ещё хотелось бы, чтоб связка работала без pas_uno.dll, то есть чтоб экзешнику программы не требовалось для работы с опен-офисом ничего, кроме самого опен-офиса. Ни dll-ек своих, ни специально прописанных путей в PATH.


1) Английским-письменным мы владеем (но нам стыдно за него :) )
2) По поводу статической линковки dll, как уже было сказано, сделаем. С возражением согласны.
3) по поводу pas_uno.dll вопрос весьма спорный. Эта библиотека необходима, чтобы OO сам мог подгрузить мост, когда он кому-нибудь понадобится. Т.е. когда из кода пытаемся получить enviroment "pas", то OO ищет именно эту библиотеку. Подробнее см. http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/AdvUNO/Implementation_Loader ( там в самом низу)
Okoshkin
новенький
 
Сообщения: 10
Зарегистрирован: 09.08.2007 15:33:18

Re: FreePascal и OpenOffice

Сообщение Nashev » 26.05.2008 16:14:07

Остаётся вопрос - зачем нужен именно паскалевский enviroment ? Чем он отличается от, например, сишного, который в комплекте с офисом идёт?
Аватара пользователя
Nashev
новенький
 
Сообщения: 13
Зарегистрирован: 23.05.2008 21:57:28

Re: FreePascal и OpenOffice

Сообщение PublicJoke » 26.05.2008 16:44:08

Если совсем по-простому, то это задел на будущее, для обеспечения той самой двунаправленности моста.
PublicJoke
новенький
 
Сообщения: 41
Зарегистрирован: 04.07.2006 12:21:07

Re: FreePascal и OpenOffice

Сообщение Nashev » 26.05.2008 17:18:08

Почему бы нашим программам не пользоваться тем enviroment-ом, который уже есть - сишным, например?

Или вообще может быть можно без него обойтись? Ведь сам мост к UNO напрямую обращается? И вообще, там что-то много про Shared Library написано - но как-то так сказано, что это типа на тот случай, если программы хотят пользоваться разделяемой библиотекой ("Every type safe programming language that stores its code in shared libraries should implement the bridge..."). Может быть, если наши программы, например, этого не хотят - можно и обойтись без регистрации официального моста к паскалю?
-------
Это я всё пишу "со своей колокольни" - мне к офису нужен доступ "уровня скриптинг" (по терминологии c http://wiki.services.openoffice.org/wik ... on_Options) - мне не нужно возможности писать свои компоненты OpenOffice на паскале, которые будут интегрироваться в OpenOffice.

Видимо, стоит два отдельных подхода различать - один упрощённый, типа возможности рулить объектами офиса напрямую из паскалевского кода, безо всяких дополнительных разделяемых библиотек, и второй - полноценный мост, реализующий для Паскаля всё то, что делает для CPP "мост UNO-CPP" - типа возможности писать свои объекты в среду UNO практически на родном CPP, и дающий самому Опен-офису при желании эти объекты создавать и использовать как любые другие свои UNO-вские. Но я не уверен, что второй вариант кому-то уже нужен.
Аватара пользователя
Nashev
новенький
 
Сообщения: 13
Зарегистрирован: 23.05.2008 21:57:28

Re: FreePascal и OpenOffice

Сообщение PublicJoke » 26.05.2008 17:46:10

Nashev писал(а):Видимо, стоит два отдельных подхода различать - один упрощённый, типа возможности рулить объектами офиса напрямую из паскалевского кода, безо всяких дополнительных разделяемых библиотек, и второй - полноценный мост, реализующий для Паскаля всё то, что делает для CPP "мост UNO-CPP" - типа возможности писать свои объекты в среду UNO практически на родном CPP, и дающий самому Опен-офису при желании эти объекты создавать и использовать как любые другие свои UNO-вские. Но я не уверен, что второй вариант кому-то уже нужен.


Вы не забывайте, что двунаправленный мост нужен не только для создания принципиально новых компонентов, но и для создания объектов - event-handler'ов, "сконструированных" строго по шаблонам OpenOffice и ловящих события непосредственно своими методами.
PublicJoke
новенький
 
Сообщения: 41
Зарегистрирован: 04.07.2006 12:21:07

Re: FreePascal и OpenOffice

Сообщение Nashev » 26.05.2008 17:58:40

Да, кстати! Ведь при этом, второй вариант (библиотека полноценного моста) вполне может быть основана на модулях первого варианта, обеспечивающих прямой доступ паскаля к UNO!

PublicJoke писал(а):Вы не забывайте, что двунаправленный мост нужен не только для создания принципиально новых компонентов, но и для создания объектов - event-handler'ов, "сконструированных" строго по шаблонам OpenOffice и ловящих события непосредственно своими методами.


хм.. повесить обработчик на событие в UNO можно только сделав у себя полноценный UNO-объект? Если это и так, то это тоже не очень критично: если полноценный мост строить - то да, можно оформлять свои обработчики в одном стиле, полноценными UNO-объектами, а если делать просто библиотеку доступа - то можно ради простых случаев в ней предусмотреть один виртуальный UNO-объект - посредник-обработчик, который будет вызывать обработчики Паскалевские, не вынуждая их делать вид,что они UNO. В однонаправленной среде вряд ли возникнут более сложные случаи, на которые такого виртуала не хватит.

Добавлено спустя 51 минуту 58 секунд:
кстати, о путях:

(Transparent_Use_of_Office_UNO_Components)
On the Windows platform, the default installation is read from the default value of the key 'Software\OpenOffice.org\UNO\InstallPath' from the root key HKEY_CURRENT_USER in the Windows Registry. If this key is missing, the key is read from the root key HKEY_LOCAL_MACHINE.
Аватара пользователя
Nashev
новенький
 
Сообщения: 13
Зарегистрирован: 23.05.2008 21:57:28

Re: FreePascal и OpenOffice

Сообщение PublicJoke » 26.05.2008 19:16:37

При написании обратного направления моста есть одна неприятность, которую обойти без существенного снижения удобства для конечного программиста невозможно - нужно писать на асме. Именно это и сдерживает, особенно памятуя о том, что порядок параметров, передаваемых в TCustomVariant.DispInvoke в Delphi, обратен таковому в FreePascal (это как пример подводного камня "кроссплатформенности в квадрате"). Ну и запросов таких пока не было.
При динамической линковке с путями-то всяко разберемся, это не проблема.
PublicJoke
новенький
 
Сообщения: 41
Зарегистрирован: 04.07.2006 12:21:07

Re: FreePascal и OpenOffice

Сообщение Nashev » 26.05.2008 19:29:56

PublicJoke писал(а):При написании обратного направления моста есть одна неприятность, которую обойти без существенного снижения удобства для конечного программиста невозможно - нужно писать на асме. Именно это и сдерживает, особенно памятуя о том, что порядок параметров, передаваемых в TCustomVariant.DispInvoke в Delphi, обратен таковому в FreePascal (это как пример подводного камня "кроссплатформенности в квадрате"). Ну и запросов таких пока не было.
При динамической линковке с путями-то всяко разберемся, это не проблема.


Задача - при вызове UNO сконвертить паскальное в UNO, а при вызове обратном - сконвертить обратно. Или есть желание полноценный стек вызова сформировать перед передачей управления обработчику? хм.. Меня б вполне устроило получение массива пар аргумент-значение, типа тех, что передаются в UNO.

Кста, а обратное направление без регистрации dll-ки моста - возможно ли в принципе?
Аватара пользователя
Nashev
новенький
 
Сообщения: 13
Зарегистрирован: 23.05.2008 21:57:28

Re: FreePascal и OpenOffice

Сообщение PublicJoke » 26.05.2008 20:28:29

Nashev писал(а):хм.. повесить обработчик на событие в UNO можно только сделав у себя полноценный UNO-объект?


Для cpp-шников такая техника - обычное дело, там переменная типа TNotifyEvent, например, невозможна в принципе. В UNO, соответственно, вообще нет понятия "плоская функция", все исполняется как метод.

Nashev писал(а):Задача - при вызове UNO сконвертить паскальное в UNO, а при вызове обратном - сконвертить обратно. Или есть желание полноценный стек вызова сформировать перед передачей управления обработчику? хм.. Меня б вполне устроило получение массива пар аргумент-значение, типа тех, что передаются в UNO.


Умаетесь разбираться во всевозможных хитросплетениях параметров (не говоря уже о том, что там сплошные указатели для сложных типов). Конверсию параметров должен производить именно мост. Однако там есть еще одна нехорошесть - перед рукотворным вызовом плоской паскалевской функции либо метода (разницы нет - это к вопросу о единственном обратном псевдообъекте) нет возможности узнать, что ее (его) вход/выход написан правильно.

Nashev писал(а):Кста, а обратное направление без регистрации dll-ки моста - возможно ли в принципе?

Нет.
PublicJoke
новенький
 
Сообщения: 41
Зарегистрирован: 04.07.2006 12:21:07

Re: FreePascal и OpenOffice

Сообщение Nashev » 27.05.2008 15:59:28

PublicJoke писал(а):
Nashev писал(а):Задача - при вызове UNO сконвертить паскальное в UNO, а при вызове обратном - сконвертить обратно. Или есть желание полноценный стек вызова сформировать перед передачей управления обработчику? хм.. Меня б вполне устроило получение массива пар аргумент-значение, типа тех, что передаются в UNO.


Умаетесь разбираться во всевозможных хитросплетениях параметров (не говоря уже о том, что там сплошные указатели для сложных типов). Конверсию параметров должен производить именно мост. Однако там есть еще одна нехорошесть - перед рукотворным вызовом плоской паскалевской функции либо метода (разницы нет - это к вопросу о единственном обратном псевдообъекте) нет возможности узнать, что ее (его) вход/выход написан правильно.



Дык я ж говорю, библиотека и должна сконвертить. А мне дать массив, то есть уметь вызвать обработчик с фиксированной спецификацией, а не пытаться вызывать обработчики с разными спецификациями :)

В общем, рекомендую делить библиотечку на три официальных уровня -
1) интерфейс к низкоуровневому API, модули динамичческого импорта функций из Open-офисных dll.
2) чисто скриптовый однонаправленный доступ к UNO, чтоб пинать там всё без регистрации своей dll и environment-а. Занимается конвертацией типов данных и мелкими сервисами, типа сформировать массив параметров для передачи в UNO по открытому массиву записей и функции для формирования этих записей по имени и значеням разных паскаевских типов.
3) и конечно UNO-pas bridge, опирающийся на 1-ую, и возможно 2-ю части, с dll-кой и её регистрацией.
Аватара пользователя
Nashev
новенький
 
Сообщения: 13
Зарегистрирован: 23.05.2008 21:57:28

Re: FreePascal и OpenOffice

Сообщение PublicJoke » 27.05.2008 16:47:36

Еще раз. Без pas_uno обойтись нельзя в принципе, в том числе и при работе со StarBasic'ом. Нужны только скрипты - скриптуйте прямо из Офиса, зачем Вам паскаль-то для этого нужен?
А вот насчет обратного вызова в стиле DispInvoke Вы, пожалуй, правы, именно так и сделаем.
PublicJoke
новенький
 
Сообщения: 41
Зарегистрирован: 04.07.2006 12:21:07

Re: FreePascal и OpenOffice

Сообщение Nashev » 27.05.2008 17:12:11

PublicJoke писал(а):Нужны только скрипты - скриптуйте прямо из Офиса, зачем Вам паскаль-то для этого нужен?


"Cкрипт" должен уметь напихать в отчёт данных, которые у меня паскальная программа получает, показывает и т.п... Хотя - ну нельзя - так нельзя. Хотя, я этот вопрос ещё погляжу сам как-нить :)
Аватара пользователя
Nashev
новенький
 
Сообщения: 13
Зарегистрирован: 23.05.2008 21:57:28

Re: FreePascal и OpenOffice

Сообщение Okoshkin » 27.05.2008 17:41:06

Так мы собственно для тех же целей этот проект затеяли (по началу).
Решение - гораздо проще. Пишете на StarBasic-e свои скрипты и вызываете их из pas программы, передавая в них нужные параметры. Могу пример прислать если нужно!
Okoshkin
новенький
 
Сообщения: 10
Зарегистрирован: 09.08.2007 15:33:18

Re: FreePascal и OpenOffice

Сообщение Nashev » 28.05.2008 01:47:17

а давайте сюда, вложением
Аватара пользователя
Nashev
новенький
 
Сообщения: 13
Зарегистрирован: 23.05.2008 21:57:28

Re: FreePascal и OpenOffice

Сообщение Okoshkin » 28.05.2008 22:30:32

Пардон за поздний ответ.

сразу прошу прощения, но полноценный пример я выложить пока не смогу (цейтнот - диссер :) ). Пример появится после 10 июня.
А пока просто направление, куда копать:
1) в файле uno_pascal_helper.pas из сырцов с сайта проекта есть функции
Код: Выделить всё
 
function ConstructMacroURL(ALibName, AModulName, AMacrosName, ALanguage: String): String;
function RunMacros( const ADocument: Variant; MacrosURL: String; MacrosInParams: Variant; var MacrosOutParams, MacrosOutIndexses: Variant): Variant;

Пользоваться примерно так (так я считываю разметку документа):
Код: Выделить всё
const
  ...
  if not VarIsNull(fUNODocument) then begin
    tmpName := ConstructMacroURL( 'OOReporterLib', 'OOReporter', 'GetFields', 'Basic' );
    tmpInParams := VarArrayCreate([0,0],varVariant);
    tmpInParams[0] := fUNODocument;
    tmpFields := RunMacros( fUNODocument, tmpName, tmpInParams, tmpOutParams, tmpOutIndexes );
    if ( (not VarIsNull(tmpFields)) and VarIsArray(tmpFields) ) then
      for i := VarArrayLowBound(tmpFields, 1) to VarArrayHighBound(tmpFields, 1)
        do AddField(VarToStr(tmpFields[i]));
  end;
  ...

2) В ОО создаете свою библиотеку макросов и наполняете ее скриптами чтения / вставки
здесь к примеру вызывается такой скрипт
Код: Выделить всё
public FieldsNames() as String

function GetFields
  GetStringFields(FieldsNames()) 
  GetTablesFields(FieldsNames())
end function

sub GetStringFields(AFieldsArray() as String)
  dim vEnum
  dim vVal
  vEnum = ThisComponent.GetTextFields().CreateEnumeration()
  if not IsNull(vEnum) then
    do while vEnum.HasMoreElements()
      vVal = vEnum.NextElement()
      if vVal.SupportsService("com.sun.star.text.TextField.Input") then
        if LCase(Left(vVal.GetPropertyValue("Hint"), Len(OOReporterPathPref))) = LCase(OOReporterPathPref) then
          AppendToArray(AFieldsArray(), vVal.GetPropertyValue("Hint"))
        end if 
      end if
    loop
  end if     
end sub

sub GetTablesFields(AFieldsArray() as String)
  dim vEnum
  dim vVal
  vEnum = ThisComponent.GetTextFields().CreateEnumeration()
  if not IsNull(vEnum) then
    do while vEnum.HasMoreElements()
      vVal = vEnum.NextElement()
      if vVal.SupportsService("com.sun.star.text.TextField.Input") then
        if LCase(Left(vVal.GetPropertyValue("Hint"), Len(OOReporterPathPref))) = LCase(OOReporterPathPref) then
          AppendToArray(AFieldsArray(), vVal.GetPropertyValue("Hint"))
        end if 
      end if
    loop
  end if     
end sub

3) в общем все это работало так:
* кто-то (пользователь) размечает ОО документ - я писал (на старбасике) диалоговый мастер разметки;
* pas программа вызывает макросы получения - отдачи данных из документа
* ВСЕ :)
Okoshkin
новенький
 
Сообщения: 10
Зарегистрирован: 09.08.2007 15:33:18

Пред.След.

Вернуться в Office Lib

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru