С-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 работает без проблем. Что не так?
 
название либы вроде правильно...
вот пример -
 
Ну лучше убедиться, наверное - посмотреть имена файлов. Может, расширение надо указывать?
Да, откуда код запускается - непосредственно из Лотуса? Может, надо полный путь указать к библиотеке?
 
Мыш
Запускается из клиента 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, полечи, плз, этот *цензуред* модуль *цензуры*.
 
названия функций написаны с маленькой буквы а надо с большой
 
это старые вызовы...
терь вот
Declare Sub OSGetExecutableDirectory Lib "libnotes.dylib" Alias "OSGetExecutableDirectory" (Byval mydirname As String)
в каталоге нотусни, либы терь так называются
молиб попросить юзверя лист каталога
либо свежие доки по СиАПИ смореть
 
8.5 если склероз не врет...
это в лепёрде произошло (версия мак ос х)
 
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 ничего не нашёл.
 

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".
 
теоретически - апи д.б. кроссплатформенным и потому - параметры д.б. одинаковой размерности
 
ща проверил Димину билиотеку - работает (без изменений размерностей)
у мя, правда, не Snow Leopard, а просто лепёрд (10.5.8) и проц 32бит (Core Duo)
10.6 версии макОСх убили поддержку PPC и добавили 64бит дрова и режим работы
 
теоретически - апи д.б. кроссплатформенным и потому - параметры д.б. одинаковой размерности
Note C API действительно кроссплатформен, но на уровне исходных кодов. Тут ключевое слово "С". При портировании сишных проектов, как правило достаточно перекомпиляции, без правки исходников. А размерности типов данных могут быть и разными в скомпилированном модуле. Встроенный int первый тому подтверждение.
 
TIA я предполагал применительно к вызовам из нотусёвых либ, в LS...
 
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? Мучить пользователя (а на маках обычно сидят непростые пользователи) не очень хочется...
 
в тесте выше - я взял старый вызов...
работало, конечно есть риск срыва стека

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

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

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