Открытие Меню Файла Из Lotus Notes

Статус
Закрыто для дальнейших ответов.

AnnaS

Active member
12.03.2013
35
0
#1
Добрый день,

можно ли прописать агент на Lotus Script в Lotus Notes, чтобы открылось меню файла на раб.столе, аналогично как открывает такое меню правая кнопка мыши?

Функцию извлечения и запуска файла я сделала, а вот открыть меню так же, как делает правая кнопка мыши, даже идеи пока не имею.

Если кто представляет, прошу помочь.
 

savl

Lotus team
28.10.2011
2 136
105
#2
:mellow:
Меню именно для файла?
То есть надо:
1. Свернуть лотус.
2. Выделить файл на рабочем столе.
3. Нажать правую кнопку мыши.

WinApi курить надо, думаю
 

AnnaS

Active member
12.03.2013
35
0
#3
:mellow:
Меню именно для файла?
То есть надо:
1. Свернуть лотус.
2. Выделить файл на рабочем столе.
3. Нажать правую кнопку мыши.

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

savl

Lotus team
28.10.2011
2 136
105
#4
только Лотус сворачивать не надо.
Не уверен, что именно так можно.
Win работает на основе дескрипторов, чтобы вызвать меню надо задать этот дескриптор.
В большинстве своем это дескриптор окна и с файлами это область выделения файла.
Возможно есть вариант получить этот дескриптор не через фокус...
Но даже если и так, вопрос будет еще в том, чтобы вызвать именно системное меню, не самописное, а системное...

На Lotus Script можно подключать функции из сторонних библиотек, пример:
Код:
Declare Private Function CreatePopupMenu Lib "user32.dll" Alias "CreatePopupMenu" () As Long
 

savl

Lotus team
28.10.2011
2 136
105
#5
зачем такая мудреная автоматизация?
Какая конечная цель? Может есть другие варианты.
 

AnnaS

Active member
12.03.2013
35
0
#6
зачем такая мудреная автоматизация?
Какая конечная цель? Может есть другие варианты.


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

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

итог: реализовать,что прошу в первом сообщении (запуск одной из строк меню, которое в винд открывается правой кнопкой мыши). но это будет делать агент лотус.
 

savl

Lotus team
28.10.2011
2 136
105
#7
именно запуск функции подписи, затем я оба файла ( подпись и файл) импортирую обратно в лотус.
Пункт меню всего лишь запустит системную команду, которая прописана для таких файлов.
А та в свою очередь уже запустит функцию подписи из DLL системы ЭЦП.
Если вычислить эту функцию, то можно, теоретически (потому что не все закладывают), использовать ее напрямую из Lotus.
И не надо будет городить сложностей.
Узнать функцию можно либо у разработчиков этой системы, либо в документации к системе, может и в интернете есть.
Система шифрования какая?
 

VladSh

начинающий
Lotus team
11.12.2009
1 277
6
#8
файл в лотусе, я его извлекаю с помощью агента в опред.папку на раб столе. мне нужно в этот агент добавить: именно запуск функции подписи, затем я оба файла ( подпись и файл) импортирую обратно в лотус.
Подпись можно получить в виде хэшсуммы и записать её в док лотуса, при таком подходе файл подписи не нужен. А потом, впоследствии, сравнивать этот хэш.
И, если поддерживает API подписания, то и файл можно не извлекать на диск, а вычитать и передать его содержимое. В нормальных системах это поддерживается, т.к. все эти фанрузки файлов и формирование ещё каких-то файлов - позавчерашний день. Разве что потом надо куда-то во вне отсылать эти доки.
Меню тут не принципиально, т.к. это UI. Можно хоть в кнопке, хоть в действии, хоть по комбинации клавиш реализовать подписание, главное чтобы работало, а потом уж наворачивать меню и т.п.
 

rinsk

Lotus team
12.11.2009
904
44
#9
Подпись можно получить в виде хэшсуммы и записать её в док лотуса, при таком подходе файл подписи не нужен. А потом, впоследствии, сравнивать этот хэш.
И, если поддерживает API подписания, то и файл можно не извлекать на диск, а вычитать и передать его содержимое. В нормальных системах это поддерживается, т.к. все эти фанрузки файлов и формирование ещё каких-то файлов - позавчерашний день. Разве что потом надо куда-то во вне отсылать эти доки.
Меню тут не принципиально, т.к. это UI. Можно хоть в кнопке, хоть в действии, хоть по комбинации клавиш реализовать подписание, главное чтобы работало, а потом уж наворачивать меню и т.п.
Такими позавчерашними днями балуются сегодня всяческие регуляторы - типа ЦБ и т.п.... так что у коллеги похоже выбора то и не...

Папку можно попробовать открыть через UrlOpen("file://$userprofile%/Desktop")
 

AnnaS

Active member
12.03.2013
35
0
#12
спасибо, выгрузку из лотуса и подпись файла сделала через bat.
теперь надо в Лотусе удалить старый файл и прекрепить файл уже с подписью.

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

savl

Lotus team
28.10.2011
2 136
105
#13
так... удаление файлов. Пишу с кодом и по шагам чтобы было понятнее.
Шаги:
0. Выгрузили файл, подписали. (это сделано)
Код:
FilePath = TargetPath & attach.Source
Call attach.ExtractFile(FilePath) ' FilePath - это путь куда выгрузили
'Запуск bat на полпись
Это у вас сделано.
1. Удалить аттач из Rt-поля.
Код:
Call attach.Remove()
2. Крепим то что было выгружено и подписано
Код:
Call FileBody.embedobject(EMBED_ATTACHMENT,"", FilePath) 'FilePath - это путь к подписанному файлу
'FileBody - имя RT-поля
Если файлов было несколько, то FilePath каждого файла надо сохранять в массив при выгрузке.
Так же лучше удалять аттачи только после подписи, то есть еще раз в цикле по ним пройтись после запуска bat.
Ну и крепим аттачи на основании пути или путей, но уже в цикле.
 

AnnaS

Active member
12.03.2013
35
0
#14
Вот что у меня получилось:

Dim session As NotesSession
Dim db As NotesDatabase
Dim dc As NotesDocumentCollection
Dim doc As NotesDocument
Dim body As NotesRichTextItem
Dim rtnav As NotesRichTextNavigator
Dim att As NotesEmbeddedObject
Dim stream As NotesStream
Dim fileNum As Integer
Dim fileName As String

Set session = New NotesSession
Set db = session.CurrentDatabase
Set dc = db.UnprocessedDocuments
Set doc = dc.GetFirstDocument
If Not doc.HasEmbedded Then Exit Sub
Set body = doc.GetFirstItem("Body")
Set rtnav = body.CreateNavigator
Set stream = session.CreateStream

If rtnav.FindFirstElement(RTELEM_TYPE_FILEATTACHMENT) Then
Do
Set att = rtnav.GetElement()
filepath$ = "C:\Users\3702_svc_fku04\Desktop\1\" & att.Source
Call att.ExtractFile(filepath$)
Print filepath$ & " файл извлечен"
Loop While rtnav.FindNextElement()

fpath$ = "C:\Users\3702_svc_fku04\Desktop\tdhelper_sig.lnk"
res = Shell("rundll32 url.dll,FileProtocolHandler " & fpath$, 4)
Call att.Remove()
Call Body.EmbedObject(EMBED_ATTACHMENT," ",filepath$)
End If


Наверное,что-то не так, т.к. не удаляет файл.
Когда открываю РК Лотуса в режиме редактирования, чтоб агент файл удалил, то ошибка "Док-т еще не сохранен". Если запускаю агент в сохраненной РК Лотуса, то файл не удаляется.
И файл не прикрепляет.
Что не так?
 

savl

Lotus team
28.10.2011
2 136
105
#15
Код:
Call att.Remove()
На этой строке объект уже не определен, не существует его.

Вот такой цикл надо делать еще раз, либо немного сменить.
Код:
If rtnav.FindFirstElement(RTELEM_TYPE_FILEATTACHMENT) Then
Do
Set att = rtnav.GetElement()
Call att.Remove()
Loop While rtnav.FindNextElement()
end if
Я аттачменты получаю вот так:
Код:
ForAll x In Body.Embeddedobjects
If x.type = 1454 Then ' Проверка что это файл
Call x.ExtractFile(...)
End if
End Forall
fpath$ = "C:\Users\3702_svc_fku04\Desktop\tdhelper_sig.lnk"
Мощно... А если пользователь будет другой, а не "3702_svc_fku04"?
 

AnnaS

Active member
12.03.2013
35
0
#16
Мощно... А если пользователь будет другой, а не "3702_svc_fku04"?
[/quote]

ну,у меня пока это временная папка.
я потом в сист папку лотуса спрячу свой путь)))
 

AnnaS

Active member
12.03.2013
35
0
#17
Вышенаписанное попробовала.
не удаляет и не подкрепляет файлы.
 

savl

Lotus team
28.10.2011
2 136
105
#18
может ошибки какие есть при работе?
нет сообщений?
можете показать код + описание как происходит его вызов(режим чтения, редактирования, сохранения документа и тд)
 

AnnaS

Active member
12.03.2013
35
0
#19
может ошибки какие есть при работе?
нет сообщений?
можете показать код + описание как происходит его вызов(режим чтения, редактирования, сохранения документа и тд)
Sub Initialize

Dim session As NotesSession
Dim db As NotesDatabase
Dim dc As NotesDocumentCollection
Dim doc As NotesDocument
Dim body As NotesRichTextItem
Dim rtnav As NotesRichTextNavigator
Dim att As NotesEmbeddedObject
Dim stream As NotesStream
Dim fileNum As Integer
Dim fileName As String

Set session = New NotesSession
Set db = session.CurrentDatabase
Set dc = db.UnprocessedDocuments
Set doc = dc.GetFirstDocument
If Not doc.HasEmbedded Then Exit Sub
Set body = doc.GetFirstItem("Body")
Set rtnav = body.CreateNavigator
Set stream = session.CreateStream

If rtnav.FindFirstElement(RTELEM_TYPE_FILEATTACHMENT) Then
Do
Set att = rtnav.GetElement()
filepath$ = "C:\Users\37\Desktop\1\" & att.Source
Call att.ExtractFile(filepath$)
Print filepath$ & " файл извлечен"
Loop While rtnav.FindNextElement()

fpath$ = "C:\Users\37\Desktop\tdhelper_sig.lnk"
res = Shell("rundll32 url.dll,FileProtocolHandler " & fpath$, 4)

If rtnav.FindFirstElement(RTELEM_TYPE_FILEATTACHMENT) Then
Do
Set att = rtnav.GetElement()
Call att.Remove()
Print "файл удален"
Loop While rtnav.FindNextElement()
End If

Call Body.EmbedObject(EMBED_ATTACHMENT," ",filepath$)
End If


End Sub
 

Вложения

savl

Lotus team
28.10.2011
2 136
105
#20
Раз документ всегда открыт на экране, то можно получать doc иначе.
Так же я не увидел сохранения документа и поскольку идет работа с RT-полем, то после всех изменений его надо переоткрыть.
Ну и режим редактирования сменить на чтение.
Попробуйте вот эту версию:
Код:
Sub Initialize
Dim session As NotesSession
Dim db As NotesDatabase
Dim dc As NotesDocumentCollection
Dim doc As NotesDocument
Dim body As NotesRichTextItem
Dim rtnav As NotesRichTextNavigator
Dim att As NotesEmbeddedObject
Dim stream As NotesStream
Dim fileNum As Integer
Dim fileName As String

dim ws as new notesuiworkspace
dim uidoc as notesuidocument

Set session = New NotesSession
Set db = session.CurrentDatabase
'Set dc = db.UnprocessedDocuments
'Set doc = dc.GetFirstDocument

set uidoc = ws.currentDocument
set doc = uidoc.document

call doc.replaceitemvalue("SaveOptions","0")

if uidoc.EditMode then uidoc.EditMode = False

If Not doc.HasEmbedded Then Exit Sub
Set body = doc.GetFirstItem("Body")
Set rtnav = body.CreateNavigator
Set stream = session.CreateStream

If rtnav.FindFirstElement(RTELEM_TYPE_FILEATTACHMENT) Then
Do
Set att = rtnav.GetElement()
filepath$ = "C:\Users\37\Desktop\1\" & att.Source
Call att.ExtractFile(filepath$)
Print filepath$ & " файл извлечен"
Loop While rtnav.FindNextElement()

fpath$ = "C:\Users\37\Desktop\tdhelper_sig.lnk"
res = Shell("rundll32 url.dll,FileProtocolHandler " & fpath$, 4)

If rtnav.FindFirstElement(RTELEM_TYPE_FILEATTACHMENT) Then
Do
Set att = rtnav.GetElement()
Call att.Remove()
Print "файл удален"
Loop While rtnav.FindNextElement()
End If

Call Body.EmbedObject(EMBED_ATTACHMENT," ",filepath$)
End If

call doc.save(true,doc.IsResponse)

call uiDoc.close
call ws.EditDocument(false,doc)
End Sub
 
Статус
Закрыто для дальнейших ответов.