• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Умирает notesdocument

  • Автор темы Cheburan
  • Дата начала
C

Cheburan

Здравствуйте.
Гибнет NotesDocument, примерно в вот таком случае:
есть библиотека
Код:
'Script Library 'TEST'
Option Public
Option Declare
 
Use "GetDatabase"
 
Sub testDbObj( param List As Variant )
	Dim db As NotesDatabase
	Dim doc As NotesDocument
 
	Set db = getSomeDb()
	Set doc = db.Getdocumentbyunid( "6F51A2A353115418C2257F6A0035127A" )
	MsgBox "testDbObj " & (doc Is nothing)
	Set param("123") = doc
End Sub

и кнопка на форме
Код:
Sub Click(Source As Button)
	Dim param List As Variant
	Dim var As Variant
 
	Redim var(0)
	var(0) = "123"
	param("123") = var
	Call testDbObj( param )
	Msgbox "Click " & (param("123") Is Nothing)
End Sub

Функция getSomeDb из SL GetDatabase возвращает NotesDatabase - берет из представления документ с настройками о том где лежит база и создает объект.

При нажатии получаем следующие сообщения:
testDbObj False
Click True

Таким образом NotesDocument умер. Бывают и другие примеры подобного поведения. Кто-то сталкивался с таким? Как лечить, или может где-то описана причина такого поведения?
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
180
@Cheburan,
Dim db As NotesDatabase заменить на Static db As NotesDatabase
У Вас объект базы уничтожается при выходе из функции testDbObj.
 
C

Cheburan

Спасибо. А если это метод класса? Т.е. если сам метод модификации списка принадлежит классу и получение NotesDatabase происходит через вызов функции класса?
 
Последнее редактирование:

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
или обьявить базу в глобале, чтобы она не уничтожалась
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
215
Спасибо. А если это метод класса? Т.е. если сам метод модификации списка принадлежит классу и получение NotesDatabase происходит через вызов функции класса?
время жизни объекта БД д.б. больше времени жизни объектов из него полученных
я, обычно, объявляю Private db As NotesDatabase
и в конструкторе инициализирую
[DOUBLEPOST=1464009783,1464009557][/DOUBLEPOST]это еще один гвоздь в гроб подхода процедурного стиля кодирования
там где легаси - придется затыкать через Static или глобальную в либе
и да, при глобальной db она д.б. Public иначе теже грабли
 

VladSh

начинающий
Lotus Team
11.12.2009
1 784
157
BIT
57
Лучше глобальная private-переменная - список БД. В таком случае переменная и public-функция получения БД одни для всего остального кода базы.
 

rinsk

Lotus Team
12.11.2009
1 151
125
BIT
4
так и до класса не далече
чур я - за класс! :)
стараюсь где можно избавится от явного получения set db= и юзаю конструкцию из 2-х классов -
первый типа public DataModelClassBase -
Базовый класс представляет собой контейнер, который возвращает все необходимые базы
'и представления приложения. и второй - Public Class DataModelMH As DataModelClassBase
пользовательские ф-ции и в этой же библе обьявляется public переменная Public MH As DataModelMH
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!