С-api под Мак: ошибка "error In Loading Dll"

nvyush

Well-Known Member
Lotus team
22.04.2009
2 317
0
#1
Здравствуйте все!
Возникла необходимость заставить работать модуль, использующий очереди, под Маком. Объявляю функции так:
Код:
Declare Private Function mac_apiMQCreate Lib "NotesLib" Alias "MQCreate" (Byval QueueName As String, Byval Quota As Integer, Byval Options As Long) As Integer
Declare Private Function mac_apiMQOpen Lib "NotesLib" Alias "MQOpen" (Byval QueueName As String, Byval Options As Long, RetQueue As Long) As Integer
Declare Private Function mac_apiMQClose Lib "NotesLib" Alias "MQClose" (Byval Queue As Long, Byval Options As Long) As Integer
Declare Private Function mac_apiMQPut Lib "NotesLib" Alias "MQPut" (Byval Queue As Long, Byval Priority As Integer, Byval Buffer As Lmbcs String, Byval Length As Integer, Byval Options As Long) As Integer
Declare Private Function mac_apiMQGet Lib "NotesLib" Alias "MQGet" (Byval Queue As Long, Byval Buffer As Lmbcs String, Byval BufLength As Integer, Byval Options As Long, Byval timeout As Long, retMsgLength As Integer) As Integer
Declare Private Function mac_apiMQGetCount Lib "NotesLib" Alias "MQGetCount" (Byval Queue As Long) As Integer
Declare Private Function mac_apiOSLoadString Lib "NotesLib" Alias "OSLoadString" (Byval hModule As Long, Byval StringCode As Integer, Byval retBuffer As Lmbcs String, Byval BufferLength As Integer) As Integer
На первом же вызове функции mac_apiMQCreate получаю ошибку: "Error in loading DLL".
Аналогичный код под Windows/32 работает без проблем. Что не так?
 

Мыш

Well-Known Member
Lotus team
12.02.2008
1 087
13
#4
Ну лучше убедиться, наверное - посмотреть имена файлов. Может, расширение надо указывать?
Да, откуда код запускается - непосредственно из Лотуса? Может, надо полный путь указать к библиотеке?
 

nvyush

Well-Known Member
Lotus team
22.04.2009
2 317
0
#5
Мыш
Запускается из клиента LN. Файлы поглядеть не могу ибо машинка не моя, вижу только скриншот ошибки. Session.Platform = "Macintosh". Завтра попытаюсь выяснить версию клиента и оси.
Да, по ссылке, предоставленной OKEN отмечено "It's interesting that different platforms have different size of handles. Some are Long and others are Integer. See declares for details". Попробовал в объявлениях заменить Long на Integer. LN-клиент "ушёл в себя", вернулся только после р*цензура*а.
Re: вернулся после reboot'а.
Off: Vital, полечи, плз, этот *цензуред* модуль *цензуры*.
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 226
25
#6
названия функций написаны с маленькой буквы а надо с большой
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 492
367
#9
это старые вызовы...
терь вот
Declare Sub OSGetExecutableDirectory Lib "libnotes.dylib" Alias "OSGetExecutableDirectory" (Byval mydirname As String)
в каталоге нотусни, либы терь так называются
молиб попросить юзверя лист каталога
либо свежие доки по СиАПИ смореть
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 492
367
#11
8.5 если склероз не врет...
это в лепёрде произошло (версия мак ос х)
 

nvyush

Well-Known Member
Lotus team
22.04.2009
2 317
0
#12
lmike
Так и есть:
IBM Lotus Notes 8.5
Release 8.5.1
Revision 20090929.1223 (Release 8.5.1)
Standard Configuration

Mac OS X 10.6.5

А как теперь описывать тип MQHANDLE — Long или Integer? Раньше, как я понял, на Маках нужно было использовать Integer. В Google ничего не нашёл.
 

nvyush

Well-Known Member
Lotus team
22.04.2009
2 317
0
#14
Совет "Translating API Data Types to LotusScript" по вышеуказанной ссылке датирован September 4, 2002 (updated January 2, 2003). У меня нет уверенности, что в Mac OS X Handler — Integer. Библиотека-то уже другая, была "NotesLib", стала "libnotes.dylib".
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 492
367
#15
теоретически - апи д.б. кроссплатформенным и потому - параметры д.б. одинаковой размерности
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 492
367
#16
ща проверил Димину билиотеку - работает (без изменений размерностей)
у мя, правда, не Snow Leopard, а просто лепёрд (10.5.8) и проц 32бит (Core Duo)
10.6 версии макОСх убили поддержку PPC и добавили 64бит дрова и режим работы
 

TIA

:-)
Lotus team
15.05.2009
790
3
#17
теоретически - апи д.б. кроссплатформенным и потому - параметры д.б. одинаковой размерности
Note C API действительно кроссплатформен, но на уровне исходных кодов. Тут ключевое слово "С". При портировании сишных проектов, как правило достаточно перекомпиляции, без правки исходников. А размерности типов данных могут быть и разными в скомпилированном модуле. Встроенный int первый тому подтверждение.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 492
367
#18
TIA я предполагал применительно к вызовам из нотусёвых либ, в LS...
 

nvyush

Well-Known Member
Lotus team
22.04.2009
2 317
0
#19
TIA я предполагал применительно к вызовам из нотусёвых либ, в LS...
Declare Function W32_OSLockObject Lib "NNOTES.DLL" Alias "OSLockObject" (Byval handle As Long) As Lmbcs String
Declare Function MAC_OSLockObject Lib "NotesLib" Alias "OSLockObject" (Byval handle As Integer) As Lmbcs String
Взято отсюда: http://www-10.lotus.com/ldd/nd6forum.nsf/5...b7?OpenDocument
Вот меня и терзают смутные сомнения — в новой маковской библиотеке handle по-старому Integer или по-новому Long? Мучить пользователя (а на маках обычно сидят непростые пользователи) не очень хочется...
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 492
367
#20
в тесте выше - я взял старый вызов...
работало, конечно есть риск срыва стека

Добавлено: по правильному - надо лезть в хидеры и смореть

Добавлено: тестил так:
Код:
Declare Private Function apiMQCreate Lib "libnotes.dylib" Alias "MQCreate" (Byval QueueName As String, Byval Quota As Integer, Byval Options As Long) As Integer
Declare Private Function apiMQOpen Lib "libnotes.dylib" Alias "MQOpen" (Byval QueueName As String, Byval Options As Long, RetQueue As Long) As Integer
Declare Private Function apiMQClose Lib "libnotes.dylib" Alias "MQClose" (Byval Queue As Long, Byval Options As Long) As Integer
Declare Private Function apiMQPut Lib "libnotes.dylib" Alias "MQPut" (Byval Queue As Long, Byval Priority As Integer, Byval Buffer As Lmbcs String, Byval Length As Integer, Byval Options As Long) As Integer
Declare Private Function apiMQGet Lib "libnotes.dylib" Alias "MQGet" (Byval Queue As Long, Byval Buffer As Lmbcs String, Byval BufLength As Integer, Byval Options As Long, Byval timeout As Long, retMsgLength As Integer) As Integer
Declare Private Function apiMQGetCount Lib "libnotes.dylib" Alias "MQGetCount" (Byval Queue As Long) As Integer
Declare Private Function apiOSLoadString Lib "libnotes.dylib" Alias "OSLoadString" (Byval hModule As Long, Byval StringCode As Integer, Byval retBuffer As Lmbcs String, Byval BufferLength As Integer) As Integer
Код:
Sub testMQ
Dim mq As New NotesMessageQueue({MQ_TEST})
mq.Message={test message}
Print {messages:} & Cstr(mq.Messages)	
Print mq.Message
End Sub