Папка:
01. Технические вопросы, 06. Разработка Notes-приложений, 99. Разное
Тип сообщения:
Решение
Сообщение:
Эх, давно не брал я в руки бубен…:)
Вот читал на форуме про Очереди, про передачу значений из апплета, и вспомнилась старая мысль «а как бы передать из агента или в агент уже созданный нотсовский объект?». Понятно, что нормальными средствами этого сделать нельзя (на сколько мне известно :) ). Вот и стал думать… «Достал бубен, стряхнул с него пыль, вытряхнул дохлых тараканов…»
Решение, в общем, нашлось, не скажу что уж совершенно красивое, но прикольное….
Сохранить объект можно во внешнем COM сервере и потом получить его от туда в другом месте!
т.е. можно создать ActiveX.Exe, установить параметры, что бы одна версия работала со всеми запросами и «гонять» объекты через него…
для тестов создал простой, но вполне функциональный ActiveX.exe, который может получать и отдавать клиенту объект по ключу:
COM-объект: DCN_Obj.ObjCollection
Методы:
Add(Obj as Variant, key as String) – добавляет в коллекцию объект с ключом, если объект с таким ключом уже есть в коллекции возвращает False и объект не добавляется в коллекцию.
Item(key as String) – возвращает объект в соответствии с ключом, если объекта с таким ключом нет возвращает Nothing.
Remove(key as String) – удаляет объект с указанным ключом, если объекта нет возвращает False.
Count() – возвращает количество объектов в коллекции.
Далее берем нашу базу данных, в которой мы собираемся устроить обмен объектов между модулями, в «Общая программа БД» в (Declarations) описываем переменную, которая будет ссылаться на внешний COM сервер, и будет удерживать его в памяти пока открыта база данных. Далее там же в Initialize создаем наш объект.
Dim dcnObj As Variant
Sub Initialize
Set tst = CreateObject("DCN_Obj.ObjCollection")' создаем COM объект
End Sub
И далее мы можем в нашей базе использовать данный «обменник» для передачи любых объектов, мало того можно получать эти объекты во внешних приложениях и т.д… При этом например не важно сохранен только что созданный документ или нет, он будет сохранен в коллекции и может быть получен в другом модуле или агенте….
Например, можно организовать вот такое взаимодействие двух агентов:
1-ый агент:
Dim ses As New NotesSession
Dim tst As Variant
Dim doc As notesDocument
Msgbox "Данный агент создает в памяти документ и сохраняет его в DCN_Obj.ObjCollection"
Set tst = CreateObject("DCN_Obj.ObjCollection")
If Not tst.Item("NoSave") Is Nothing Then
If Not tst.Remove("NoSave") Then
Msgbox "Not remove Object"
End If
End If
Set doc = New NotesDocument(ses.CurrentDatabase)’ СОЗДАЕМ док-т
If Not tst.Add(doc, "NoSave") Then ' Помещаем в коллекцию
Msgbox "NoAdd"
End If
2-ой агент:
Dim doc As Variant
Dim v1 As Variant
Dim v2 As Variant
Msgbox "Данный агент получает из DCN_Obj.ObjCollection документ созданный только в памяти"
Set tst = CreateObject("DCN_Obj.ObjCollection")
Set doc = tst.Item("NoSave") ' получаем документ
If doc Is Nothing Then
Msgbox "doc is nothing"
Else
v1 = doc.GetItemValue("Field")
v2 = doc.GetItemValue("Field2")
Messagebox v1(0)+"-"+Cstr(v2(0))
End If
Необходимо заметить, что возвращаемые объекты имеют тип Variant (!) [OBJECT]. И при этом, если у Вас еще объект «живой» вы том месте от куда Вы его сохранили в коллекцию (например, из UIDocument'а Вы запускаете агента), то изменения полученного объекта будут влиять на объект который был «прародителем», т.е. остается связь этих объектов.
Что еще можно сделать, так это получить сохраненные объекты, во внешнее приложение поддерживающие работу с COM объектами. Например, если мы сохраним в коллекцию объект-документ, то мы можем его получить хотя бы в WHS, при этом там работать с ним почти как с объектом самого Notes’а (все методы и свойства будут Вам доступны, хотя WHS понятия не имеет о Notes'е)…
Что еще можно выжать из данной технологии это решать Вам – а вариантов видится огромное множество, например Callback из внешнего приложения… :)
Ну и в довершение вот сам COM сервер, его исходники, и тестовая база использующая данную технологию… (что бы зарегистрировать COM сервер необходимо его просто запустить, что бы разрегистрировать, необходимо запустить COM сервер с ключом /unregserver)
P.S. надо еще эту технологию в варианте DCOM попробовать…. :)))