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

Тема в разделе "Lotus - Программирование", создана пользователем AnnaS, 23 авг 2013.

Статус темы:
Закрыта.
  1. AnnaS

    AnnaS Active Member

    Регистрация:
    12 мар 2013
    Сообщения:
    35
    Симпатии:
    0
    Добрый день,

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

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

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

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    :mellow:
    Меню именно для файла?
    То есть надо:
    1. Свернуть лотус.
    2. Выделить файл на рабочем столе.
    3. Нажать правую кнопку мыши.

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

    AnnaS Active Member

    Регистрация:
    12 мар 2013
    Сообщения:
    35
    Симпатии:
    0
    именно так, только Лотус сворачивать не надо.
    надо, чтобы все это происходило из самого Лотуса,
    и не правой кнопкой мыши, а чтоб агент это сделал.
     
  4. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    Не уверен, что именно так можно.
    Win работает на основе дескрипторов, чтобы вызвать меню надо задать этот дескриптор.
    В большинстве своем это дескриптор окна и с файлами это область выделения файла.
    Возможно есть вариант получить этот дескриптор не через фокус...
    Но даже если и так, вопрос будет еще в том, чтобы вызвать именно системное меню, не самописное, а системное...

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

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    зачем такая мудреная автоматизация?
    Какая конечная цель? Может есть другие варианты.
     
  6. AnnaS

    AnnaS Active Member

    Регистрация:
    12 мар 2013
    Сообщения:
    35
    Симпатии:
    0


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

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

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

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    Пункт меню всего лишь запустит системную команду, которая прописана для таких файлов.
    А та в свою очередь уже запустит функцию подписи из DLL системы ЭЦП.
    Если вычислить эту функцию, то можно, теоретически (потому что не все закладывают), использовать ее напрямую из Lotus.
    И не надо будет городить сложностей.
    Узнать функцию можно либо у разработчиков этой системы, либо в документации к системе, может и в интернете есть.
    Система шифрования какая?
     
  8. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Подпись можно получить в виде хэшсуммы и записать её в док лотуса, при таком подходе файл подписи не нужен. А потом, впоследствии, сравнивать этот хэш.
    И, если поддерживает API подписания, то и файл можно не извлекать на диск, а вычитать и передать его содержимое. В нормальных системах это поддерживается, т.к. все эти фанрузки файлов и формирование ещё каких-то файлов - позавчерашний день. Разве что потом надо куда-то во вне отсылать эти доки.
    Меню тут не принципиально, т.к. это UI. Можно хоть в кнопке, хоть в действии, хоть по комбинации клавиш реализовать подписание, главное чтобы работало, а потом уж наворачивать меню и т.п.
     
  9. rinsk

    rinsk Lotus team
    Lotus team

    Регистрация:
    12 ноя 2009
    Сообщения:
    795
    Симпатии:
    78
    Такими позавчерашними днями балуются сегодня всяческие регуляторы - типа ЦБ и т.п.... так что у коллеги похоже выбора то и не...

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    rinsk в урле нет ли ошибки?

    Добавлено:
    UrlOpen("file://%userprofile%/Desktop")
     
  11. rinsk

    rinsk Lotus team
    Lotus team

    Регистрация:
    12 ноя 2009
    Сообщения:
    795
    Симпатии:
    78
    Ну да, конечно - %USERPROFILE% надо подставить путь к профайлу.
    Можно проверить -@URLOpen("file://c:\\")

    Это только один из вариантов открытие фолдера...
     
  12. AnnaS

    AnnaS Active Member

    Регистрация:
    12 мар 2013
    Сообщения:
    35
    Симпатии:
    0
    спасибо, выгрузку из лотуса и подпись файла сделала через bat.
    теперь надо в Лотусе удалить старый файл и прекрепить файл уже с подписью.

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

    savl Lotus team
    Lotus team

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

    AnnaS Active Member

    Регистрация:
    12 мар 2013
    Сообщения:
    35
    Симпатии:
    0
    Вот что у меня получилось:

    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


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

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    Код (LotusScript):
    Call att.Remove()
    На этой строке объект уже не определен, не существует его.

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

    AnnaS Active Member

    Регистрация:
    12 мар 2013
    Сообщения:
    35
    Симпатии:
    0
    Мощно... А если пользователь будет другой, а не "3702_svc_fku04"?
    [/quote]

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

    AnnaS Active Member

    Регистрация:
    12 мар 2013
    Сообщения:
    35
    Симпатии:
    0
    Вышенаписанное попробовала.
    не удаляет и не подкрепляет файлы.
     
  18. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    может ошибки какие есть при работе?
    нет сообщений?
    можете показать код + описание как происходит его вызов(режим чтения, редактирования, сохранения документа и тд)
     
  19. AnnaS

    AnnaS Active Member

    Регистрация:
    12 мар 2013
    Сообщения:
    35
    Симпатии:
    0
    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
     

    Вложения:

  20. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    Раз документ всегда открыт на экране, то можно получать doc иначе.
    Так же я не увидел сохранения документа и поскольку идет работа с RT-полем, то после всех изменений его надо переоткрыть.
    Ну и режим редактирования сменить на чтение.
    Попробуйте вот эту версию:
    Код (LotusScript):
    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
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей