Lotusscript + Dll + Unicode Pointer

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

  1. ToxaRat

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

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    В общем необходимо вызвать функцию из виндовых библиотек
    и вот не вьежаю как правильно её задекларить
    Функция требует чтобы переменные были типа LPCWSTR
    Читаю описание LPCWSTR
    An LPCWSTR is a 32-bit pointer to a constant string of 16-bit Unicode characters, which MAY be null-terminated.
    This type is declared as follows:
    typedef const wchar_t* LPCWSTR;


    но из всех возможных удаётся в декларе только variant
    Declare Function CryptUIDlgSelectCertificateFromStore Lib "Cryptui" (Byval hCertStore As Long, Byval hwnd As Long, Byval pwszTitle As Variant...

    вызываю просто:
    Call CryptUIDlgSelectCertificateFromStore(hStore, 0, "Выбор"...

    попытка передать массив байт, задекларить иначе, другими переменніми - или валит лотус или тайпмисмач

    Собственно от Variant хотелось бы уйти и понять что именно ему передать?
     
  2. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Byval pwszTitle As LMBCS String ?
    Можно также глянуть в справке дизайнера разделы "Passing strings", "Declare statement (external C calls)".

    Также возможны варианты:
    Byval pwszTitle As Unicode String
    Byval pwszTitle As Any
     
  3. ToxaRat

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

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    точно, спасибо, помогло :crash:

    Добавлено: теперь следующий пример, более суровый
    суть момента в том что pKeyInfo это своего рода плавающая структура(её длина из-за наличия внутри стрингов разная)
    описание MSDN
    нормально удалось её задекларить лишь так
    Declare Function CertGetCertificateContextProperty Lib "Crypt32" (Byval pCertContext As Long, Byval dwPropId As Long, Byval pvData As String, pcbData As Long) As Long
    первый раз она возвращает длинну сертификата, второй раз ей предварительно передаётся обьект с нужной длинной, потом обьект как видим дер*цензура*ится
    чтобы лотус не упал первый и второй раз, приходится передавать стринг
    как-то можно потом не по символьно раздер*цензура*ить стринг на обьект?

    ума не приложу как описать такой тип и еще и ресайзить его в лотусе
     
  4. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Это штатное использование такого рода функций http://msdn.microsoft.com/en-us/library/aa...v=vs.85%29.aspx
    Нужно также иметь ввиду, что при втором вызове также возвращается истинный размер данных, помещённых в буфер, он может быть меньше размера буфера.

    Судя по описанию функции CertGetCertificateContextProperty ( http://msdn.microsoft.com/en-us/library/aa...v=vs.85%29.aspx ) то, что она возвращает в буфере, зависит от параметра dwPropId. Можно попробовать реализовать требуемые структуры данных на LS и передавать в качестве буфера переменные соответствующего типа, а функцию задекларировать так:
    Declare Function CertGetCertificateContextProperty Lib "Crypt32" (Byval pCertContext As Long, Byval dwPropId As Long, pvData As Any, pcbData As Long) As Long
     
  5. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    а зачем понадобилось криптоапи виндей?... пароли прятать хотите? :crash:
    дык по темже усером - оно полюбасу будет доступно
    этож не keyring - как в нормальных системах, а очередной МС костыль (на почве SSO)
     
  6. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    В таких случаях делаю разные декларации и один альяс. Что-то вроде:

    Declare Function CertGetCertificateContextProperty1 Lib "Crypt32" Alias "CertGetCertificateContextProperty" (..., pvData As MyType1, ...) As Long
    Declare Function CertGetCertificateContextProperty2 Lib "Crypt32" Alias "CertGetCertificateContextProperty" (..., pvData As MyType2, ...) As Long
    Declare Function CertGetCertificateContextProperty3 Lib "Crypt32" Alias "CertGetCertificateContextProperty" (..., ByVal pvData As MyType3, ...) As Long
     
  7. ToxaRat

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

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    так вот и я про это как бы я не обьявлял свои тип такую фичу как в Сях - pKeyInfo := AllocMem(size); я в лотусе сделать не могу - а НАДО
    так как в следующий момент этот тип становится на 50 байт больше/меньше

    не, как раз таки всё проще, большинство локальных сертифицированных криптопровайдеров начали использовать этот интерфейс - там можно назначать какой криптопровайдер юзать и всё становится напорядок проще а не затачиваться постоянно под индивидуала :crash:
     
  8. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Больше не должно. Иначе может лечь не только Лотус, но и система. А вместо pKeyInfo := AllocMem(size) обычно используется
    pKeyInfo = String$(size, Chr$(0)). Если возвращаемая структура содержит только одно строковое поле и оно последнее, его размер легко вычислить, зная размеры остальных полей фиксированного размера, и тогда в качестве буфера в вызов функции можно подставлять переменную соответствующего типа. В противном случае остаётся только парсить строку.
     
  9. ToxaRat

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

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    именно так и сделал

    правду говоришь, но тут как раз всё плохо так как два стринга 1я и 3я переменная...
     
  10. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
Загрузка...
Похожие Темы - Lotusscript Dll Unicode
  1. Sanchezz86
    Ответов:
    12
    Просмотров:
    1.116
  2. seoman2
    Ответов:
    9
    Просмотров:
    361
  3. stranik
    Ответов:
    8
    Просмотров:
    844
  4. erhe
    Ответов:
    22
    Просмотров:
    1.274
  5. lmike
    Ответов:
    4
    Просмотров:
    764

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