После защиты паролем через библиотеку, макрос перестал работать

Автор Konstanta, 7 февраля 2020, 10:54

0 Пользователи и 1 гость просматривают эту тему.

Kadet

Накатал в багзилу - Bug 135799

В общем лажа какая-то получается и этой парольной защитой и со встроенными макросами.
Глюк парольной защиты уже обсудили и багзилу накатали.

А вот со встроенными библиотеками вопрос поинтересней. Не смотря на то, что формально программа и определяет эту библиотеку (MyLibrary) загруженной, но периодически просто перестаёт её видеть и ругается на каждый макрос из неё, сообщая, что он не определён.
Полагаю, что суть дела тут в том, что во время загрузки основной формы у меня загружаются одновременно два как бы не связанных между собою документа - сама форма, встроенная в БД и вложенный в IFrame документ Calc. И они, делают вид, что друг друга не знают. А при загрузке в какой-то момент времени активным является то один то другой. А библиотека вложена в БД и если активным на данный момент времени определяется форма, т.е. БД, то и макросы видны и работают, а если документ Calc, то программа наотрез отказывается видеть те макросы, которые вложены в БД.
Именно по этой причине некогда я и перешёл на все внешние библиотеки, хотя изначально писал всё во встроенных.

А парольная защита на внешних библиотеках, которые нужно импортировать при установке БД теряет свой смысл, потому что при импорте библиотеки спрашивается пароль на библиотеку, и если клиент не получит пароль, то и установить библиотеку не сможет. И для чего тогда эта защита?

sokol92

Поясните, пожалуйста, свой баг. Если с библиотеки в документе снять парольную зашиту, сохранить документ и вновь открыть, то LO 7.0.0.3 "падает".
Парольная зашита библиотек, на мой взгляд, нужна для гарантии авторских прав и неизменяемости кода. Вряд ли пользователю нужно сообщать пароли от библиотек.
Импорт библиотеки документа в библиотеки приложения можно производить макросом - см. главу 17 книги Питоньяка OOME_4_0.odt.
Владимир.

Kadet

Цитата: sokol92 от 16 августа 2020, 16:54Импорт библиотеки документа в библиотеки приложения можно производить макросом - см. главу 17 книги Питоньяка OOME_4_0.odt.
Спасибо! Сейчас пороюсь в "святом писании LO".

Цитата: sokol92 от 16 августа 2020, 16:54Поясните, пожалуйста, свой баг. Если с библиотеки в документе снять парольную зашиту, сохранить документ и вновь открыть, то LO 7.0.0.3 "падает".
Нет. Не так. Если на библиотеку установить пароль, то программа начинает ругаться во время попытки подключить эту библиотеку, на ThisDatabaseDocument.BasicLibraries.LoadLibrary("MyLibrary"), но при этом, как и подсказал Rimi, библиотека действительно подгружается и всё работает. И это такая фигня ещё в 6.3.6 присутствует. (На счёт работы макросов в той версии не проверял).
Это что касается этой ошибки и внешней библиотеке, которая для защиты не интересна, по той причине, что её паролить не имеет смысла.

А на встроенной библиотеке там сложней. если активен встроенный документ Calc, то он не видит макросы, встроенные в БД... хоть с паролем, хоть без. А сей документ (Calc) при каждом запуске создаётся вновь, поэтому заранее положить в него библиотеку нет возможности. Сейчас буду грызть "святое писание" по этому вопросу. Пока вижу один выход - макросом экспортировать библиотеку из БД а Calc.

sokol92

Цитата: Kadet от 16 августа 2020, 17:53Нет. Не так
1. Выполнил все действия, указанные в описании бага 135799. Ошибка, связанная с LoadLibrary, возникла.
2. Снял парольную защиту с библиотеки MyLibrary документа и сохранил документ. Закрыл LO (на всякий случай)
3. Открываю документ. LO "улетает со свистом".
Владимир.

Kadet

Цитата: sokol92 от 16 августа 2020, 18:043. Открываю документ. LO "улетает со свистом".
Это не та ошибка. Мы её уже обсуждали в другой ветке и mikekaganski нашёл решение - ТУТ
Вы действительно попали на эксклюзивный баг 7-ки связанный с подключением новой библиотеки LO - Skia.

Или я не понял фразы - "улетает со свистом" ("работает быстро" или "впадает в ошибку").

Kadet

Нихрена я не пойму, что с этими библиотеками не так.
Сделал макрос, который переносит нужные модули макросов в новый документ. Загружаю эту новую библиотеку из нового документа (Calc). И всё равно - при первом обращении к любому макросу из этих библиотек - ошибка. "Функция не определена".
If (NOT oDoc.BasicLibraries.HasByName("MyLibrary"))  AND ThisDatabaseDocument.Title="Cyanopica.odb" Then
oLibs = ThisDatabaseDocument.BasicLibraries
oLib = oLibs.getByName("MyLibrary")

oLibs1 = oDoc.BasicLibraries
oLibs1.createLibrary("MyLibrary")
oLib1 = oLibs1.getByName("MyLibrary")
oLib1.insertByName("dlgALL", oLib.getByName("dlgALL"))
oLib1.insertByName("ListenerSet", oLib.getByName("ListenerSet"))
oLib1.insertByName("TabPage", oLib.getByName("TabPage"))

ThisDatabaseDocument.DialogLibraries.loadLibrary("MyLibrary")
oDoc.BasicLibraries.LoadLibrary("MyLibrary")
End If

mikekaganski

Надо не макрос делать, а постараться сделать минимальный репродюсор. Вы изначально вместо того, чтобы проделать необходимую для этого работу, занялись поисками обхода. Очень обычный подход, который заметает проблему под ковёр, а потом делает её ещё более труднонаходимой.

Взять Ваш документ и определить последовательность действий, которая гарантированно даёт проблему. Затем начать убирать макросы до тех пор, пока проблема не перестанет воспроизводиться. Сделать самый-самый минимум, который даёт её. Это позволит создать багдок, который реально поможет найти и исправить её, либо понять и посоветовать.
С уважением,
Михаил Каганский

sokol92

Предлагаю рассмотреть сначала следующий простой случай.

Открываем в Calc приложенный файл TestDoc.ods, который содержит библиотеку Mylib, которая содержит модуль Module1, который содержит макрос TestDocument (в доме, который построил...  :))

Записываем в любой модуль библиотеки Standard из My Macros & Dialogs следующий макрос и выполняем его:

Sub TestApp
 ThisComponent.BasicLibraries.LoadLibrary("Mylib")
 TestDocument()
End Sub


В версиях 7.0.0.3 (Win10) и 6.4.4.2 (Ubuntu) выдается сообщение о ненахождении свойства или метода.

Разве из библиотек приложения можно вызывать макросы загруженных библиотек документов подобным образом?
Владимир.

rami

Можно через диспетчера:
Sub runMacro
Dim oDisp, macroURL$
oDisp = createUnoService("com.sun.star.frame.DispatchHelper")
macroURL = "macro://TestDoc/MyLib.Module1.TestDocument"        'адрес запускаемого макроса:  "macro://имя_документа(открытого)/библиотека.модуль.макрос"
oDisp.executeDispatch(StarDesktop, macroURL, "", 0, Array())
End Sub

Kadet

rami, спасибо за идею. Сейчас опробую.

А теперь попробую на двух пальцах объяснить самую суть проблемы, потому что видно, что есть некоторое непонимание. И это же есть самый простой способ показать суть проблемы. (Демку пока не делаюю, если загорится сделаю).
Итак, допустим, есть два разных документа. Один Write, другой Calc (по сути не важно, даже если они оба будут Calc-и или Write). Допустим во Write есть встроенный макрос (лежащий во внутренней библиотеке). Открываем оба документа одновременно и пробуем из Calc обратиться к макросу, который лежит во Write (допустим делает такую кнопку в Calc). Это не получается.
Вот самый простой пример самой сути проблемы.

С глобальными библиотека этой проблемы нет, они всем видны по умолчанию, а вот для встроенных библиотек - это проблема.
При этом, при загрузке формы я научился отлавливать и сохранять в глобальных переменных сами доки и Write и Calc, и потом из любого из этих документов я могу менять  что-то в другом документе. Это вообще без проблем. А вот вытащить и использовать макросы, которые встроены в другой документ - в этом и есть проблема.

sokol92

Эта же проблема (вызов макроса документа не из документа) в "чистом" виде - в сообщении #37.
Кроме использования диспетчера, можно вызвать метод invoke, который недавно обсуждался на форуме.
Владимир.

Kadet

Цитата: rami от 17 августа 2020, 13:15Можно через диспетчера:
Почему-то не получилось.
В документе сделал простенький макрос:

Sub TestMac()
MsgBox("Макрос сработал")
End Sub

Положил его в
Cyanopica - имя документа БД.
MyLibrary - название библиотеки.
TabPage - модуль в котором лежит TestMac.
Обращаюсь к нему извне:
Sub runMacro
Dim oDisp, macroURL$
oDisp = createUnoService("com.sun.star.frame.DispatchHelper")
macroURL = "macro://Cyanopica/MyLibrary.TabPage.TestMac"        'адрес запускаемого макроса:  "macro://имя_документа(открытого)/библиотека.модуль.макрос"
oDisp.executeDispatch(StarDesktop, macroURL, "", 0, Array())
MsgBox "Остановка"
End Sub

MsgBox "Останока" - нужен для фиксации прохождения этого кода, иначе дальше будет ошибка.
Макрос не работает. Выскакивает только "Остановка". Добавление к Cyanopica расширения .odb ни к чему не привело. Результат прежний.

Сейчас почитаю обсуждение по ссылке. Спасибо!

Kadet

Попробовал так:
oDoc.BasicLibraries.createLibraryLink("MyLibrary", "//Cyanopica/MyLibrary", False)

Даёт ошибку ввода-вывода при загрузке документа Basic.

sokol92

В #41 должно так корректно отработать при условии, что Cyanopica.odb является активным документом

Sub RunMacro3()
   Dim scriptUri
   scriptUri = "vnd.sun.star.script:MyLibrary.TabPage.TestMac?language=Basic&location=document"
    ThisComponent.scriptProvider.getScript(scriptUri).invoke(Array(), Array(), Array())
End Sub
Владимир.

Kadet

Цитата: sokol92 от 17 августа 2020, 20:39должно так корректно отработать
Отработало. Допустим этом функция, а не процедура и ей нужно передать параметр и получить от неё ответ?