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

DNT

Постоялец форума
Lotus team
12.10.2005
590
7
37
Украина, Одесса
#1
Есть библа от стороннего разработчика, которую необходимо подключить к 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 ...
результат: экзешник Лотуса валится наглухо в момент выполнения, при вызове этой функции...


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

oshmianski

Достойный программист
Lotus team
25.04.2012
546
13
#2
другие сторонние библиотеки подключаются по типу Declare Function Login Lib ... и работают нормально?
 

savl

Well-Known Member
Lotus team
28.10.2011
2 116
157
32
#4
Dll лучше через declare делать...
логи что говорят?
 

savl

Well-Known Member
Lotus team
28.10.2011
2 116
157
32
#6
файлы можете дать?
начало файла должно быть nsd_W...
 

DNT

Постоялец форума
Lotus team
12.10.2005
590
7
37
Украина, Одесса
#7
вот описание интерфейса этой dll-ки:

// *********************************************************************//
// Declaration of Enumerations defined in Type Library
// *********************************************************************//
// Constants for enum DocumentInfoType
type
DocumentInfoType = TOleEnum;
const
DOC_ALL_DOCUMENTS = $00000000;
DOC_WAIT_SIGN1 = $00000001;
DOC_WAIT_SIGN2 = $00000002;
DOC_WAIT_AUTH = $00000003;

type
IDocOperation = interface(IDispatch)
['{DCD7D6BF-2A11-4D71-A20E-ADE38CA4375F}']
function Login(const UserLogin: WideString;
const KeyPassw: WideString;
const SysPassw: WideString;
const KeyPath: WideString): WideString; safecall;
function GetDocList(DocTypes: DocumentInfoType;
const DateFrom: WideString;
const DateTill: WideString): WideString; safecall;
function ProcessDocs(const ADocList: WideString): WideString; safecall;
function InsertDocs(const ADocList: WideString): WideString; safecall;
function GetBalList(const DateBal: WideString): WideString; safecall;
function GetDocInfoList(const DateFrom: WideString;
const DateTill: WideString): WideString; safecall;
function GetFxDocList(DocTypes: DocumentInfoType;
const DateFrom: WideString;
const DateTill: WideString): WideString; safecall;
function ProcessFxDocs(const ADocList: WideString): WideString; safecall;
function InsertFxDocs(const ADocList: WideString): WideString; safecall;
function GetFxBalList(const DateBal: WideString): WideString; safecall;
function GetFxDocInfoList(const DateFrom: WideString;
const DateTill: WideString): WideString; safecall;
end;
Может я не правильно объявляю?

На примере функции "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_W...
все файлы "nsd_" нулевого размера...
Может надо где-то включить дебаггинг?
 

DNT

Постоялец форума
Lotus team
12.10.2005
590
7
37
Украина, Одесса
#8
может всетаки смотреть в сторону использования 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".
Может проблема с кодировкой/форматом/еще какой-то мутней ?


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

savl

Well-Known Member
Lotus team
28.10.2011
2 116
157
32
#9
DNT
Скорее всего пароль надо превращать в формат delphi wildString
Возможно он поступает в unicode, но гадать можно долго...
С разрабом нельзя связаться для анализа?
 

DNT

Постоялец форума
Lotus team
12.10.2005
590
7
37
Украина, Одесса
#10
там все сложно с разрабом. ответ один - "из Excel же работает"...

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

[
uuid(78C01614-D68E-4F2D-AC8C-B3F783BA2EED),
version(1.0),
helpstring("iFOBSDocIntegrator Library")

]
library iFOBSDocIntegrator
{

importlib("STDOLE2.TLB");

[
uuid(A6103CA4-D33A-48A5-BB08-7893A12BE5D8),
version(1.0),
helpstring("DocOperation Object")
]
coclass DocOperation
{
[default] interface IDocOperation;
};

[
uuid(DCDADB16-7566-4FE8-B51C-87D2B7C8EB18),
version(1.0)
]
typedef enum tagDocumentInfoType
{
DOC_ALL_DOCUMENTS = 0,
DOC_WAIT_SIGN1 = 1,
DOC_WAIT_SIGN2 = 2;
DOC_WAIT_AUTH = 3
} DocumentInfoType;

[
uuid(DCD7D6BF-2A11-4D71-A20E-ADE38CA4375F),
version(1.0),
helpstring("Dispatch interface for DocOperation Object"),
dual,
oleautomation
]
interface IDocOperation: IDispatch
{
[
id(0x000000C9)
]
HRESULT _stdcall Login([in] BSTR UserLogin, [in] BSTR KeyPassw, [in] BSTR SysPassw, [in] BSTR KeyPath, [out, retval] BSTR * Result );
[
id(0x000000CA)
]
HRESULT _stdcall GetDocList([in] DocumentInfoType DocTypes /*Warning: unable to validate structure name: */, [in] BSTR DateFrom, [in] BSTR DateTill, [out, retval] BSTR * Result );
[
id(0x000000CB)
]
HRESULT _stdcall ProcessDocs([in] BSTR ADocList, [out, retval] BSTR * Result );

[
id(0x000000CС)
]
HRESULT _stdcall InsertDocs([in] BSTR ADocList, [out, retval] BSTR * Result );
[
id(0x000000CD)
]
HRESULT _stdcall GetBalList ( [in] BSTR DateBal, [out, retval] BSTR * Result);
[
id(0x000000CE)
]
HRESULT _stdcall GetDocInfoList([in] BSTR DateFrom, [in] BSTR DateTill, [out, retval] BSTR * Result );
[
id(0x000000DA)
]
HRESULT _stdcall GetFxDocList([in] DocumentInfoType DocTypes /*Warning: unable to validate structure name: */, [in] BSTR DateFrom, [in] BSTR DateTill, [out, retval] BSTR * Result );
[
id(0x000000DB)
]
HRESULT _stdcall ProcessFxDocs([in] BSTR ADocList, [out, retval] BSTR * Result );
[
id(0x000000DС)
]
HRESULT _stdcall InsertFxDocs([in] BSTR ADocList, [out, retval] BSTR * Result );
[
id(0x000000DD)
]
HRESULT _stdcall GetFxBalList ( [in] BSTR DateBal, [out, retval] BSTR * Result);
[
id(0x000000DE)
]
HRESULT _stdcall GetFxDocInfoList([in] BSTR DateFrom, [in] BSTR DateTill, [out, retval] BSTR * Result );
};
};
Мне кажется проблема в формате передаваемого мной стринга: надо как-то передать BSTR или "delphi wildString"
Есть идеи?
 

savl

Well-Known Member
Lotus team
28.10.2011
2 116
157
32
#11
А такой маневр?
Код:
dim skey as string
skey = {D:\key\}
GetConnect= myobj.Login ("123","456","789",skey)
 

DNT

Постоялец форума
Lotus team
12.10.2005
590
7
37
Украина, Одесса
#12
А такой маневр?
Код:
dim skey as string
skey = {D:\key\}
GetConnect= myobj.Login ("123","456","789",skey)
Неа, все равно отвечает "Access violation at address 00000000. Read of address 00000000"
Но не валится, что дает надежду.
Как еще можно попробовать стринг передать?
 

oshmianski

Достойный программист
Lotus team
25.04.2012
546
13
#13
...[ ByVal ] name As [ LMBCS | Unicode ] [ dataType | Any ]...
_http://www.codestore.net/help/help6_designer.nsf/89d3962efd85426f85256b870069c0aa/3a2282e875f0f53385256c1c003fb345?OpenDocument

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

savl

Well-Known Member
Lotus team
28.10.2011
2 116
157
32
#14
Код:
Dim skey as variant
По идее так что угодно можно передать...
И еще нашел такую штуку, что автоматическое преобразование WildString для COM сделали полноценно только в Delphi 9
Если библиотека собрана версией меньше, то автоматика не пашет.
А ручного преобразования я пока так и не нашел...

Добавлено: Кстати да, может LMBCS поможет
 

Domino-Designer

Well-Known Member
Lotus team
06.12.2011
394
100
#15
TS

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

DNT

Постоялец форума
Lotus team
12.10.2005
590
7
37
Украина, Одесса
#16
TS

1. Что у вас в настройках безопасности? (Access violation как бы намекает не двусмысленно)
2. Покажите VB Excel, который работает
про безопастность не понял... Значение "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
...[ ByVal ] name As [ LMBCS | Unicode ] [ dataType | Any ]...
_http://www.codestore.net/help/help6_designer.nsf/89d3962efd85426f85256b870069c0aa/3a2282e875f0f53385256c1c003fb345?OpenDocument
пробовал и то и другое - валится клиент ...

в качестве бреда: может еще битность оси и либы влияет?
Винда у меня 64-битная - но грйобанный Excel же работает, он тоже 32-битный как и Лотус.

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

hosm

* so what *
18.05.2009
2 442
9
42
Kiev, Ukraine
#17
Странно, что последний параметр описан и как const и как [out, retval] BSTR * Result - т.е. это может быть и возвращаемое или изменяемое значение? мож, тогда надо передавать как переменную и убрать в декларации byval.

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

DNT

Постоялец форума
Lotus team
12.10.2005
590
7
37
Украина, Одесса
#18
Странно, что последний параметр описан и как const и как [out, retval] BSTR * Result - т.е. это может быть и возвращаемое или изменяемое значение? мож, тогда надо передавать как переменную и убрать в декларации byval.
пробовал, изначально было без 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
 

Domino-Designer

Well-Known Member
Lotus team
06.12.2011
394
100
#20
DNT, библиотеки, которые вызываются как СОМ объекты могут тупо не поддерживать вызов отдельных функций.
Excel в твоем примере использует СОМ, так и делай. Это же приложение, а не обособленная библа, с таким же успехом, можно пробовать декларировать в LS Excel DLL и ругаться на Lotus.