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

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

  1. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Здравствуйте все!
    Возникла необходимость заставить работать модуль, использующий очереди, под Маком. Объявляю функции так:
    Код (LotusScript):
    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 работает без проблем. Что не так?
     
  2. Мыш

    Мыш Lotus team
    Lotus team

    Регистрация:
    12 фев 2008
    Сообщения:
    1.020
    Симпатии:
    8
    А как на Маке библиотеки правильно называются? Линукс от Виндов отличается в этом плане...
     
  3. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
  4. Мыш

    Мыш Lotus team
    Lotus team

    Регистрация:
    12 фев 2008
    Сообщения:
    1.020
    Симпатии:
    8
    Ну лучше убедиться, наверное - посмотреть имена файлов. Может, расширение надо указывать?
    Да, откуда код запускается - непосредственно из Лотуса? Может, надо полный путь указать к библиотеке?
     
  5. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Мыш
    Запускается из клиента 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, полечи, плз, этот *цензуред* модуль *цензуры*.
     
  6. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    названия функций написаны с маленькой буквы а надо с большой
     
  7. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    КМК, все алиасы прописаны с большой буквы. А как я эти функции называю в LN, ось не должно волновать. Или я не прав?
     
  8. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    вроде прав. там главное указать имена алиасов и параметры правильно (тип и т.п.)
     
  9. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    это старые вызовы...
    терь вот
    Declare Sub OSGetExecutableDirectory Lib "libnotes.dylib" Alias "OSGetExecutableDirectory" (Byval mydirname As String)
    в каталоге нотусни, либы терь так называются
    молиб попросить юзверя лист каталога
    либо свежие доки по СиАПИ смореть
     
  10. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    lmike
    А с какой версии это пошло? с 8ки?
     
  11. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    8.5 если склероз не врет...
    это в лепёрде произошло (версия мак ос х)
     
  12. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    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 ничего не нашёл.
     
  13. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    http://www.nsftools.com/tips/APITips.htm
    HANDLE - Long (Integer on Mac and some UNIX)
     
  14. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Совет "Translating API Data Types to LotusScript" по вышеуказанной ссылке датирован September 4, 2002 (updated January 2, 2003). У меня нет уверенности, что в Mac OS X Handler — Integer. Библиотека-то уже другая, была "NotesLib", стала "libnotes.dylib".
     
  15. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    теоретически - апи д.б. кроссплатформенным и потому - параметры д.б. одинаковой размерности
     
  16. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    ща проверил Димину билиотеку - работает (без изменений размерностей)
    у мя, правда, не Snow Leopard, а просто лепёрд (10.5.8) и проц 32бит (Core Duo)
    10.6 версии макОСх убили поддержку PPC и добавили 64бит дрова и режим работы
     
  17. TIA

    TIA :-)
    Lotus team

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    TIA я предполагал применительно к вызовам из нотусёвых либ, в LS...
     
  19. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    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? Мучить пользователя (а на маках обычно сидят непростые пользователи) не очень хочется...
     
  20. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    в тесте выше - я взял старый вызов...
    работало, конечно есть риск срыва стека

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

    Добавлено: тестил так:
    Код (Text):
    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
    Код (Text):
    Sub testMQ
    Dim mq As New NotesMessageQueue({MQ_TEST})
    mq.Message={test message}
    Print {messages:} & Cstr(mq.Messages)  
    Print mq.Message
    End Sub
     
Загрузка...

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