Подключение Сторонней Dll

Тема в разделе "Lotus - Программирование", создана пользователем DNT, 20 янв 2015.

  1. DNT

    DNT Постоялец форума
    Lotus team

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    Есть библа от стороннего разработчика, которую необходимо подключить к Lotus и использовать ее методы и т.д.
    Эта библиотека зарегистрирована в винде, оформлена как COM объект.
    Как пример использования от разработчика этой DLL у меня есть файлик MS Excel в котором этот COM объект подключен и успешно используется, я провярял - все отлично, все методы работают, возвращают результат и т.д.

    Теперь о главном.
    Подключаем объект к Lotus:
    1 вариант, используем COM объект:
    Код (Text):
    Set myobj = createobject( "имя")
    GetConnect= myobj.Login ("123","456","789","D:\key\")
    результат некрасивый: "Access violation at address 00000000. Read of address 00000000"

    Попробовал так (заведомо неправильно):
    Код (Text):
    Set myobj = createobject( "имя")
    GetConnect= myobj.Login ("123","456","789","1")
    результат красивый: "Указан неправильный путь к ключам пользователя!"

    Исходя из этого результата может мне нужно в какой-то кодировке передавать переменные?
    Как-бы это единственная ниточка за которую удалось ухватиться, потому как пробовал еще два варианта использования но там совсем болото:

    2 вариант, используем всю библиотеку Uselsx:
    Код (Text):
    Uselsx "библа"
    результат: экзешник Лотуса валится наглухо прямо из дизайнера при дописании этой строки...

    3 вариант, используем объявление отдельных функций из библы:
    Код (Text):
    Declare Function Login Lib ...
    результат: экзешник Лотуса валится наглухо в момент выполнения, при вызове этой функции...


    Приветствуются любые ваши идеи. Заранее всем огромное спасибо.
     
  2. oshmianski

    oshmianski Достойный программист
    Lotus team

    Регистрация:
    25 апр 2012
    Сообщения:
    512
    Симпатии:
    13
    другие сторонние библиотеки подключаются по типу Declare Function Login Lib ... и работают нормально?
     
  3. DNT

    DNT Постоялец форума
    Lotus team

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    не пробовал и не использовал ранее сторонних dll
     
  4. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    Dll лучше через declare делать...
    логи что говорят?
     
  5. DNT

    DNT Постоялец форума
    Lotus team

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    вот эти \IBM_TECHNICAL_SUPPORT ?

    да ниче там ваще понять не могу...
     
  6. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    файлы можете дать?
    начало файла должно быть nsd_W...
     
  7. DNT

    DNT Постоялец форума
    Lotus team

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    вот описание интерфейса этой dll-ки:

    Может я не правильно объявляю?

    На примере функции "Login":
    объявление:
    Код (Text):
    Declare Function Login Lib "iFOBSDocIntegrator.dll" Alias "_TestLogin" (ByVal UserLogin As String,ByVal KeyPasswd As String,ByVal SysPasswd As String,ByVal KeyPath As String) As String
    вызов:
    Код (Text):
    GetConnect = Login("1","1","1","1")
    Добавлено:
    все файлы "nsd_" нулевого размера...
    Может надо где-то включить дебаггинг?
     
  8. DNT

    DNT Постоялец форума
    Lotus team

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    может всетаки смотреть в сторону использования COM ....

    только решить почему при передаче
    Код (Text):
    GetConnect= myobj.Login ("123","456","789","D:\key\")
    возвращается: "Access violation at address 00000000. Read of address 00000000"
    Может быть эта ошибка и приводит к краху клиента при объявлении dll через Declare Function?

    А если я пишу:
    Код (Text):
    GetConnect= myobj.Login ("123","456","789","1")
    ошибки такой нет, а есть корректный ответ обработчика самой dll: "Указан неправильный путь к ключам пользователя!"

    Т.е. когда я передаю "1" dll обрабатывает её корректно, а когда "D:\key\" то это вызывает "Access violation".
    Может проблема с кодировкой/форматом/еще какой-то мутней ?


    п.с. печали полные глаза ... вроде ж все просто, а не работает
     
  9. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    DNT
    Скорее всего пароль надо превращать в формат delphi wildString
    Возможно он поступает в unicode, но гадать можно долго...
    С разрабом нельзя связаться для анализа?
     
  10. DNT

    DNT Постоялец форума
    Lotus team

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    там все сложно с разрабом. ответ один - "из Excel же работает"...

    есть еще Содержимое файла iFOBSDocIntegrator.idl и указан формат BSTR, может это както поможет

    Мне кажется проблема в формате передаваемого мной стринга: надо как-то передать BSTR или "delphi wildString"
    Есть идеи?
     
  11. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    А такой маневр?
    Код (LotusScript):
    dim skey as string
    skey = {D:\key\}
    GetConnect= myobj.Login ("123","456","789",skey)
     
  12. DNT

    DNT Постоялец форума
    Lotus team

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    Неа, все равно отвечает "Access violation at address 00000000. Read of address 00000000"
    Но не валится, что дает надежду.
    Как еще можно попробовать стринг передать?
     
  13. oshmianski

    oshmianski Достойный программист
    Lotus team

    Регистрация:
    25 апр 2012
    Сообщения:
    512
    Симпатии:
    13
    ...[ ByVal ] name As [ LMBCS | Unicode ] [ dataType | Any ]...
    _http://www.codestore.net/help/help6_designer.nsf/89d3962efd85426f85256b870069c0aa/3a2282e875f0f53385256c1c003fb345?OpenDocument

    в качестве бреда: может еще битность оси и либы влияет?
     
  14. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    Код (LotusScript):
    Dim skey as variant
    По идее так что угодно можно передать...
    И еще нашел такую штуку, что автоматическое преобразование WildString для COM сделали полноценно только в Delphi 9
    Если библиотека собрана версией меньше, то автоматика не пашет.
    А ручного преобразования я пока так и не нашел...

    Добавлено: Кстати да, может LMBCS поможет
     
  15. Domino-Designer

    Domino-Designer Lotus team
    Lotus team

    Регистрация:
    6 дек 2011
    Сообщения:
    117
    Симпатии:
    4
    TS

    1. Что у вас в настройках безопасности? (Access violation как бы намекает не двусмысленно)
    2. Покажите VB Excel, который работает
     
  16. DNT

    DNT Постоялец форума
    Lotus team

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    про безопастность не понял... Значение "1" же передается нормально.

    Вот код Excel который пашет (библиотека подключена через Tools-References...):

    Код (Text):
    Sub test()
    ' Поправьте эти значения, указав логин, пароль, пароль к секретному ключу и путь к секретному ключу пользователя
    Login = Range("Login").Value '"ALGOL1"
    pwd1 = Range("Pwd_1").Value '"900"
    pwd2 = Range("Pwd_2").Value '"900"
    pathToKey = Range("Path").Value '"c:\Keys\ALGOL1_"

    Dim o As iFOBSDocIntegrator.DocOperation
    Set o = New iFOBSDocIntegrator.DocOperation
    If (o Is Nothing) Then
    MsgBox "Ошибка! iFOBSDocIntegrator.dll не зарегистрирована в системе."
    GoTo Exit1
    End If
    MsgBox "Проверка параметров Login."
    s = o.Login(Login, pwd1 , pwd2, pathToKey)
    If s <> "" Then
    MsgBox "Ошибка! Неправильно определены данные"
    MsgBox s
    GoTo Exit1
    End If
    пробовал и то и другое - валится клиент ...

    Винда у меня 64-битная - но грйобанный Excel же работает, он тоже 32-битный как и Лотус.

    Какие еще варианты господа?)))
    Разрабу написал телегу - жду ответа. Но думаю это затык чисто в Лотусе и он мне не поможет...
     
  17. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    Странно, что последний параметр описан и как const и как [out, retval] BSTR * Result - т.е. это может быть и возвращаемое или изменяемое значение? мож, тогда надо передавать как переменную и убрать в декларации byval.

    Добавлено: в эксель всё через переменные, заметь. и путь без слеша в конце попробовать, мб?
     
  18. DNT

    DNT Постоялец форума
    Lotus team

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    пробовал, изначально было без byval - также валило клиент.
    Прямое декларирование функций (пробовал мульен вариантов )- валит клиент при вызове этой функции.

    Тут вот какое дело, я тестирую дальше используя эту dll как COM объект.
    И вот что интересно - когда в переменной path появляется символ ":" это вызывает "Access violation at address 00000000. Read of address 00000000" , а если передать другую билиберду, например "D\test" то отвечает корректно: "Указан неправильный путь к ключам пользователя!"

    Чтобы это могло значить?

    Код привожу:

    Код (Text):
    Sub Initialize

    Dim sName As variant
    Dim sKey1 As Variant
    Dim sKey2 As Variant
    Dim Result As Variant
    Dim path As Variant


    sName = "testname"
    sKey1 = "testKey1"
    sKey2 = "testKey2"
    path = "D:\test"
    Set devmgr = createobject( "iFOBSDocIntegrator.DocOperation")
    Result = devmgr.Login (sName,sKey1,sKey2,path)
    Print Result

    End Sub
     
  19. DNT

    DNT Постоялец форума
    Lotus team

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    да, нет, так конечно тоже пробовал. Аксес виолейшен.
    Проблема в символе ":".
    имхо, имхо
     
  20. Domino-Designer

    Domino-Designer Lotus team
    Lotus team

    Регистрация:
    6 дек 2011
    Сообщения:
    117
    Симпатии:
    4
    DNT, библиотеки, которые вызываются как СОМ объекты могут тупо не поддерживать вызов отдельных функций.
    Excel в твоем примере использует СОМ, так и делай. Это же приложение, а не обособленная библа, с таким же успехом, можно пробовать декларировать в LS Excel DLL и ругаться на Lotus.
     
Загрузка...

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