Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

30 Сентябрь 2020, 13:09 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Часто задаваемые вопросы по LibreOffice и Apache OpenOffice.org
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: « 1 2 3 4 5 6 7 8   Вниз
  Печать  
Автор Тема: После защиты паролем через библиотеку, макрос перестал работать  (Прочитано 4783 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Kadet
Форумчанин
***
Offline Offline

Сообщений: 353


« Ответ #105: 22 Август 2020, 23:45 »

Ошибка была на LoadLibrary, а не на verifyLibraryPassword. Я же давал ссылку на обсуждение.
Записан
Kadet
Форумчанин
***
Offline Offline

Сообщений: 353


« Ответ #106: 23 Август 2020, 19:33 »

Проблему решил.
Ну, как "решил"... обошёл, как обычно. Ибо настоящее решение не далось.

Начальную базу оставил без пароля, но при первой загрузке пароли таки устанавливаются, то решил просто сохранить базу перед закрытием, чтобы и внутренняя библиотека сохранилась с паролем.
Поставил на закрытие БД небольшой макрос. Чтобы база сохранялась только при первом запуске поставил проверку.
Код:
Sub DBClose()
ON LOCAL ERROR GOTO ErrDBCloseAll:
If (ThisDatabaseDocument.isModified) Then
ThisDatabaseDocument.store()
End If
ErrDBCloseAll:
ON LOCAL ERROR GOTO 0
End Sub
Однако, выяснилось, что когда пароль устанавливается макросом, то флаг Modified не устанавливается. Поэтому пришлось делать это "насильственно". Сразу после копирования библиотек и установки паролей установил флаг Modified.
Код:
ThisDatabaseDocument.setModified(true)
Вроде бы всё работает. После этого и внутренняя библиотека и внешняя всегда запароленная.

Однако, маленькая беда таки осталась. После установки этого макроса на закрытие после закрытия документа всегда выскакивает непонятная пустая ошибка (вложение). А после "Ок" загружается старндартный "soffice.exe". Не удобно, но терпимо.
Возможно это только у меня на win7 такая проблема, а на других компах её не будет (уже такая фигня бывала). Завтра проверю.


* Error.jpg (47.23 Кб, 469x416 - просмотрено 6 раз.)
* Cyanopica_demo1.zip (2143.46 Кб - загружено 2 раз.)
« Последнее редактирование: 23 Август 2020, 19:44 от Kadet » Записан
bk
Участник
**
Offline Offline

Сообщений: 30


« Ответ #107: 23 Август 2020, 20:07 »

Вот это во вспомогательном макросе в библиотеке Standard:

Option Explicit
Sub CallLoadLib()
Dim oLibs, OldPs
oLibs = BasicLibraries
OldPs = "111"
If oLibs.hasByName("MyLibrary") Then
oLibs.LoadLibrary("MyLibrary")
  If oLibs.isLibraryPasswordProtected("MyLibrary") Then
   If NOT oLibs.isLibraryPasswordVerified("MyLibrary") Then
   oLibs.verifyLibraryPassword("MyLibrary", OldPs)
   End If
   If GlobalScope.BasicLibraries.hasByName("MyLibrary") Then
      GlobalScope.BasicLibraries.loadLibrary("MyLibrary")
      GlobalScope.DialogLibraries.loadLibrary("MyLibrary")
   End If
   If oLibs.isLibraryPasswordVerified("MyLibrary") Then
       ThisDBDoc(oLibs, OldPs) 'это тот Ваш макрос
   End If
  End If
End If
End Sub

И вот это в ThisDBDoc:

Sub ThisDBDoc(Libs, sPs)

   Dim Ps
   Ps = ""
   ThisDatabaseDocument = ThisComponent
   ThisDatabaseDocument.DataSource.Settings.RespectDriverResultSetType = false
   sDBname = ThisDatabaseDocument.DataSource.URL
   sDBURL=ThisDatabaseDocument.URL
    
    StartOsn(Pass)
       If ( NOT Libs.isLibraryPasswordProtected("MyLibrary")) Then Libs.changeLibraryPassword("MyLibrary",Ps,Pass)
   
       If Libs.isLibraryPasswordProtected("MyLibrary") Then Libs.changeLibraryPassword("MyLibrary",sPs, Pass)
        
        AddOneLib("MyLibrary", "MyLibrary", Libs, GlobalScope.BasicLibraries, true)
      AddOneLib("MyLibrary", "MyLibrary", ThisDatabaseDocument.DialogLibraries, GlobalScope.DialogLibraries, false)
            
      GlobalScope.BasicLibraries.changeLibraryPassword("MyLibrary",Ps,Pass)
      
      UserName = "Manager1"
      ThisDatabaseDocument.DataSource.User = "Manager1"
     
   LoginID(UserName)
   OpenForm0

End Sub

Всё открывает, распароливает и устанавливает новый пароль.
Но есть ньюанс: пока не понятна логика смены пароля (но он меняется и защищает библиотеку), тут надо "поиграть" с логикой, чтобы понять.
И второе: функции OpenForm0 и LoginID нужно ещё раз просмотреть (мне их пришлось корректировать - аргументы) и connect_to_database.

Возвращаю файл, но пожалуйста осмотрительно там, т.к. кое-где (в функциях, завязанных на ThisDBDoc) я внес свои изменения, когда пытался запустить. Они незначительные, касаются имен аргументов, где-то убрал Parent из метода ThisComponent, где присваивалось к ThisDatabaseDocument. Сейчас на внутренней библиотеке пароль 222.

* Cyanopica_pass_my.odb (2495.85 Кб - загружено 6 раз.)
« Последнее редактирование: 23 Август 2020, 20:19 от bk » Записан
Kadet
Форумчанин
***
Offline Offline

Сообщений: 353


« Ответ #108: 23 Август 2020, 20:38 »

bk спасибо! Потестирую.
Записан
Kadet
Форумчанин
***
Offline Offline

Сообщений: 353


« Ответ #109: 23 Август 2020, 21:10 »

bk рассмотрел ваш вариант повнимательней и пришёл к выводу, что... нет.
Такой вариант я и без допмакроса, а внутри самого ThisDBDoc() делал и он прекрасно работал, но... он не отвечает тем задачам, которые я на него возлагаю, поэтому и начал его усложнять. В принципе вы повторили мой первичный путь в этом направлении.
Однако, уж не знаю, на какой по мощности аппарате вы всё это делаете, и может вам этого не заметно, но у меня машина не сильная и не быстрая, а на некоторых предприятиях (да и на моём тоже) ещё хилее машин предостаточно. И нужно учитывать этот факт.
Ваш вариант при каждой загрузке совершает весьма трудоёмкие и длительные процедуры - снятие пароля, причём с двух библиотек, там ещё внутри AddOneLib идёт удаление прежней библиотеки в глобал, копирование большой библиотеки, а затем вновь установка паролей на две библиотеки. И так при каждой загрузке. У меня это занимает не меньше 30-60с. Это весьма долго.

Так вот, именно с целью сократить это время и оставить все эти процедуры только для первой загрузки (что в принципе приемлемо и даже привычно для многих других программ). А уже последующие запуски должны запускаться гораздо быстрей.  Именно для этого я и ввёл проверку - есть уже библиотека или её ещё нет, по сути проверяется - первый ли запуск или последующий, и в зависимости от результата - проходить ли все эти грузовые процедуры или ограничиться малым.
И вот именно с введением этой самой проверки и началась свистопляска.
Всё остальное описано выше. Не буду повторяться.
« Последнее редактирование: 23 Август 2020, 21:16 от Kadet » Записан
Страниц: « 1 2 3 4 5 6 7 8   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!