Страница 2 из 3

Re: FreePascal и OpenOffice

СообщениеДобавлено: 26.05.2008 16:09:20
Okoshkin
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 ( там в самом низу)

Re: FreePascal и OpenOffice

СообщениеДобавлено: 26.05.2008 16:14:07
Nashev
Остаётся вопрос - зачем нужен именно паскалевский enviroment ? Чем он отличается от, например, сишного, который в комплекте с офисом идёт?

Re: FreePascal и OpenOffice

СообщениеДобавлено: 26.05.2008 16:44:08
PublicJoke
Если совсем по-простому, то это задел на будущее, для обеспечения той самой двунаправленности моста.

Re: FreePascal и OpenOffice

СообщениеДобавлено: 26.05.2008 17:18:08
Nashev
Почему бы нашим программам не пользоваться тем 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-вские. Но я не уверен, что второй вариант кому-то уже нужен.

Re: FreePascal и OpenOffice

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


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

Re: FreePascal и OpenOffice

СообщениеДобавлено: 26.05.2008 17:58:40
Nashev
Да, кстати! Ведь при этом, второй вариант (библиотека полноценного моста) вполне может быть основана на модулях первого варианта, обеспечивающих прямой доступ паскаля к 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.

Re: FreePascal и OpenOffice

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

Re: FreePascal и OpenOffice

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


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

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

Re: FreePascal и OpenOffice

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


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

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


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

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

Нет.

Re: FreePascal и OpenOffice

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


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



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

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

Re: FreePascal и OpenOffice

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

Re: FreePascal и OpenOffice

СообщениеДобавлено: 27.05.2008 17:12:11
Nashev
PublicJoke писал(а):Нужны только скрипты - скриптуйте прямо из Офиса, зачем Вам паскаль-то для этого нужен?


"Cкрипт" должен уметь напихать в отчёт данных, которые у меня паскальная программа получает, показывает и т.п... Хотя - ну нельзя - так нельзя. Хотя, я этот вопрос ещё погляжу сам как-нить :)

Re: FreePascal и OpenOffice

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

Re: FreePascal и OpenOffice

СообщениеДобавлено: 28.05.2008 01:47:17
Nashev
а давайте сюда, вложением

Re: FreePascal и OpenOffice

СообщениеДобавлено: 28.05.2008 22:30:32
Okoshkin
Пардон за поздний ответ.

сразу прошу прощения, но полноценный пример я выложить пока не смогу (цейтнот - диссер :) ). Пример появится после 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 программа вызывает макросы получения - отдачи данных из документа
* ВСЕ :)