Lotusscript + Dll + Unicode Pointer

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

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 328
42
В общем необходимо вызвать функцию из виндовых библиотек
и вот не вьежаю как правильно её задекларить
Функция требует чтобы переменные были типа 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 хотелось бы уйти и понять что именно ему передать?
 
Byval pwszTitle As LMBCS String ?
Можно также глянуть в справке дизайнера разделы "Passing strings", "Declare statement (external C calls)".

Также возможны варианты:
Byval pwszTitle As Unicode String
Byval pwszTitle As Any
 
Byval pwszTitle As Unicode String
точно, спасибо, помогло :crash:

Добавлено: теперь следующий пример, более суровый
size := 0;
CertGetCertificateContextProperty(hCert, CERT_KEY_PROV_INFO_PROP_ID, nil, @size);
if size<>0 then begin
pKeyInfo := AllocMem(size);
CertGetCertificateContextProperty(hCert, CERT_KEY_PROV_INFO_PROP_ID, pKeyInfo, @size);
{ Set provider parameters }
ProviderName := pKeyInfo.pwszProvName;
ProviderType := pKeyInfo.dwProvType;
KeyName := pKeyInfo.pwszContainerName;
KeySpec := pKeyInfo.dwKeySpec;
end;
суть момента в том что pKeyInfo это своего рода плавающая структура(её длина из-за наличия внутри стрингов разная)
описание MSDN
BOOL WINAPI CertGetCertificateContextProperty(
__in PCCERT_CONTEXT pCertContext,
__in DWORD dwPropId,
__out void *pvData,
__inout DWORD *pcbData
);

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

ума не приложу как описать такой тип и еще и ресайзить его в лотусе
 
первый раз она возвращает длинну сертификата, второй раз ей предварительно передаётся обьект с нужной длинной, потом обьект как видим дер*цензура*ится
Это штатное использование такого рода функций
Нужно также иметь ввиду, что при втором вызове также возвращается истинный размер данных, помещённых в буфер, он может быть меньше размера буфера.

Судя по описанию функции CertGetCertificateContextProperty ( ) то, что она возвращает в буфере, зависит от параметра dwPropId. Можно попробовать реализовать требуемые структуры данных на LS и передавать в качестве буфера переменные соответствующего типа, а функцию задекларировать так:
Declare Function CertGetCertificateContextProperty Lib "Crypt32" (Byval pCertContext As Long, Byval dwPropId As Long, pvData As Any, pcbData As Long) As Long
 
а зачем понадобилось криптоапи виндей?... пароли прятать хотите? :crash:
дык по темже усером - оно полюбасу будет доступно
этож не keyring - как в нормальных системах, а очередной МС костыль (на почве SSO)
 
ума не приложу как описать такой тип и еще и ресайзить его в лотусе
В таких случаях делаю разные декларации и один альяс. Что-то вроде:

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
 
Это штатное использование такого рода функций ]]>http://msdn.microsoft.com/en-us/library/aa...v=vs.85%29.aspx]]>
Нужно также иметь ввиду, что при втором вызове также возвращается истинный размер данных, помещённых в буфер, он может быть меньше размера буфера.
так вот и я про это как бы я не обьявлял свои тип такую фичу как в Сях - pKeyInfo := AllocMem(size); я в лотусе сделать не могу - а НАДО
так как в следующий момент этот тип становится на 50 байт больше/меньше

а зачем понадобилось криптоапи виндей?... пароли прятать хотите?
не, как раз таки всё проще, большинство локальных сертифицированных криптопровайдеров начали использовать этот интерфейс - там можно назначать какой криптопровайдер юзать и всё становится напорядок проще а не затачиваться постоянно под индивидуала :crash:
 
так вот и я про это как бы я не обьявлял свои тип такую фичу как в Сях - pKeyInfo := AllocMem(size); я в лотусе сделать не могу - а НАДО
так как в следующий момент этот тип становится на 50 байт больше/меньше
Больше не должно. Иначе может лечь не только Лотус, но и система. А вместо pKeyInfo := AllocMem(size) обычно используется
pKeyInfo = String$(size, Chr$(0)). Если возвращаемая структура содержит только одно строковое поле и оно последнее, его размер легко вычислить, зная размеры остальных полей фиксированного размера, и тогда в качестве буфера в вызов функции можно подставлять переменную соответствующего типа. В противном случае остаётся только парсить строку.
 
А вместо pKeyInfo := AllocMem(size) обычно используется
pKeyInfo = String$(size, Chr$(0)).
именно так и сделал

Если возвращаемая структура содержит только одно строковое поле и оно последнее, его размер легко вычислить
правду говоришь, но тут как раз всё плохо так как два стринга 1я и 3я переменная...
 
Можно поискать парсеры ASN.1. Кой-чего можно почитать тут:
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab