правильный подбор типов для Dll

Тема в разделе "Lotus - Программирование", создана пользователем ToxaRat, 30 окт 2009.

  1. ToxaRat

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

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    Cобственно работаю с одной dll по ЕЦП
    но есть подозрение что она не хочет со мной работать, так как я ей подсовываю не верный тип (от неё всегда один и тот же результат - не верный тип вх. параметров)
    что требовалось:
    Код (Text):
    Function nkiEnumDevices (no:integer; withcard:boolean; var name):byte
    как это реализовалось на LS:
    Код (Text):
    Declare Function nkiEnumDevices Lib "nkidll" (no As Integer, withcard As Boolean, sName As Variant) As Byte

    Dim i As Integer, j As Integer, s As String, w As Integer, v As Variant, mas(72) As String, no As Byte, withcard As Boolean
    Print        "Existing readers:"
    i = 1
    no = 1
    Do
    v = mas
    withcard = False
    j = nkiEnumDevices(i, withcard, s)
    If j=0 Then
    Print s
    Else
    Exit Do
    End If
    i = i +1
    Loop While j<>0
    если юзать аналогичные примера на С++ или Паскале то всё пашет
    может я как-то не правильно задеклалировал функцию?
     
  2. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    no As Looong? в nkiEnumDevices
     
  3. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    В VBA при объявлении функций для строковых аргументов требовалось что-то типа ByVal sName As String
     
  4. ToxaRat

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

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    проверял и на лонг, результат тот же
     
  5. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    Не силён в Паскале. Какова размерность у типов integer, boolean? Каков тип у name?

    Если integer - 2б
    boolean - 2б
    name - ASCII string
    Тогда декларация такая
    Declare Function nkiEnumDevices Lib "nkidll" (Byval no As Integer, Byval withcard As integer, ByVal sName As String) As integer
     
  6. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    delphi - ls
    integer - long
    boolean - byte (?)
    var name - byref name (вот тут уже не помню точно, но вроде это по ссылке)
     
  7. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    В Дельфи Паскалевский синтаксис.
    long - это не размерность, а имя типа.
    То, что это некий выходной параметр понятно. Не ясен его тип. Если строка - то это важно. Если указатель на другой тип то можно просто как Any декларировать.
     
  8. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    с некоторых пор, на сколько мне известно, паскаль в делфи стали называть делфи (язык).
    про "long - это не размерность, а имя типа." не понял ниче, что ты хотел сказать? B)
    я говорю, что переменную типа integer в делфи нельзя впихнуть в integer LS, только в Long.
    не знаю чем отличается декларация as Any от as variant или от отсутствия типа :)
     
  9. oshmianski

    oshmianski Гость

    _http://www.nsftools.com/tips/APITips.htm
     
  10. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    к стати, а формат вызова не может быть проблемой?
    раньше паскаль генерил паскалевский, а не стандартный, а они вроде различны, не?..
     
  11. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    про "long - это не размерность, а имя типа." не понял ниче, что ты хотел сказать?

    Размер данных - это сколько байт памяти требуется для его хранения.
    Например, сишный int в зависимости от платформы может иметь 2, 4 и более байт.

    Variant от Any отличается тем, что размер переменной типа Variant - 16 байт, плюс размер содержащегося типа, а Any передаёт только указатель - 4 байта
     
  12. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    я понимаю, вот я по кол-ву байт и свожу :) и получается, что integer delphi = long ls
    вроде как, эти от самой платформы не зависят
     
Загрузка...

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