1. Набираем команду codeby webinar. Набираем команду для организации и проведения вебинаров. Подробнее ...

    Скрыть объявление
  2. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление
  3. Получи 30.000 рублей. Для получения денег необходимо принять участие в конкурсе авторов codeby. С условиями и призами можно ознакомиться на этой странице ...

    Внимание! Регистрация авторов на конкурс закрыта.

    Скрыть объявление

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

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

  1. DNT

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

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

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

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

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

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

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


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

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

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

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

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

    savl Well-Known Member
    Lotus team

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

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

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

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

    savl Well-Known Member
    Lotus team

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

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

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

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

    На примере функции "Login":
    объявление:
    Код:
    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
    вызов:
    Код:
    GetConnect = Login("1","1","1","1")
    Добавлено:
    все файлы "nsd_" нулевого размера...
    Может надо где-то включить дебаггинг?
     
  8. DNT

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

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

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

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

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


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

    savl Well-Known Member
    Lotus team

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

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

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

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

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

    savl Well-Known Member
    Lotus team

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

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

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

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

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

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

    savl Well-Known Member
    Lotus team

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

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

    Domino-Designer Well-Known Member
    Lotus team

    Репутация:
    1
    Регистрация:
    6 дек 2011
    Сообщения:
    367
    Симпатии:
    67
    TS

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

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

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

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

    Код:
    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 *

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

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

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

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

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

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

    Код привожу:

    Код:
    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

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

    Domino-Designer Well-Known Member
    Lotus team

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

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