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

  • Автор темы nvyush
  • Дата начала
N

nvyush

Здравствуйте все!
Возникла необходимость заставить работать модуль, использующий очереди, под Маком. Объявляю функции так:
Код:
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 работает без проблем. Что не так?
 
H

hosm

название либы вроде правильно...
вот пример -
 

Мыш

Lotus Team
12.02.2008
1 228
30
BIT
137
Ну лучше убедиться, наверное - посмотреть имена файлов. Может, расширение надо указывать?
Да, откуда код запускается - непосредственно из Лотуса? Может, надо полный путь указать к библиотеке?
 
N

nvyush

Мыш
Запускается из клиента 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

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
названия функций написаны с маленькой буквы а надо с большой
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
471
это старые вызовы...
терь вот
Declare Sub OSGetExecutableDirectory Lib "libnotes.dylib" Alias "OSGetExecutableDirectory" (Byval mydirname As String)
в каталоге нотусни, либы терь так называются
молиб попросить юзверя лист каталога
либо свежие доки по СиАПИ смореть
 
H

hosm

lmike
А с какой версии это пошло? с 8ки?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
471
8.5 если склероз не врет...
это в лепёрде произошло (версия мак ос х)
 
N

nvyush

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 ничего не нашёл.
 
N

nvyush


HANDLE - Long (Integer on Mac and some UNIX)
Совет "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
7 985
611
BIT
471
теоретически - апи д.б. кроссплатформенным и потому - параметры д.б. одинаковой размерности
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
471
ща проверил Димину билиотеку - работает (без изменений размерностей)
у мя, правда, не Snow Leopard, а просто лепёрд (10.5.8) и проц 32бит (Core Duo)
10.6 версии макОСх убили поддержку PPC и добавили 64бит дрова и режим работы
 
T

TIA

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

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
471
TIA я предполагал применительно к вызовам из нотусёвых либ, в LS...
 
N

nvyush

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
Взято отсюда:
Вот меня и терзают смутные сомнения — в новой маковской библиотеке handle по-старому Integer или по-новому Long? Мучить пользователя (а на маках обычно сидят непростые пользователи) не очень хочется...
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
471
в тесте выше - я взял старый вызов...
работало, конечно есть риск срыва стека

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

Добавлено: тестил так:
Код:
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
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!