Aqel написал:исходя из выше показанного собираю по крупицам код запроса на Delphi
Добрый день. Коллега, обратите внимание на префиксы названий полей. Они самодокументируют формат и наталкивают на мысль что должно быть в поле.
dw - целое беззнаковое (4 байта)
cb - количество байт
cch - количество символов
pb - указатель на буфер
psz - указатель на строковый буфер, оканчивающийся 0 (PChar/PAnsiChar)
c - количество элементов
Что не так понятно для программиста на Дельфи: в идеале вся структура передаваемая в CryptoApi должна быть в одном куске памяти. Все что связано указателями в структуре - должно идти друг за другом в какой-то области памяти. Без этого иногда работает, иногда нет, иногда на ровном месте выдает ошибку обращения к памяти. Где-то в глубине кода есть IsBadReadPtr с указанием на основную структуру, но размером по сумме размеров всех элементов. Когда такой вызов вылетит за пределы динамического куска памяти основной структуры - что-то может быть проигнорировано или может быть выдана ошибка проверки параметров структуры.
Чтобы добиться расположения структуры в одном куске памяти StrAlloc не в кассу, так как для каждой строчки создается отдельный буфер в отдельном куске памяти. Более того, rdn и name_info также лучше бы расположить вместе. Хотя конечно для глобальных переменных в 99% случаев это не спровоцирует ошибку - сегмент данных-то большой, Дельфи объявляет достаточно много глобальных переменных, чтобы IsBadReadPtr не вылетел за пределы.
В примере выше (9 лет назад) переменные объявлены последовательно и статически (если принять? что на той версии Дельфи string = shortstring), то есть идут друг за другом (в стэке если локальные, в сегменте данных, если глобальные), что формально удовлетворяет требование о расположении последовательно в одном куске памяти.
Однако если выделять динамические буферы под структуры и элементы или передавать структуру между процедурами, то там уже совсем другая история. Для избегания ошибки можно объявить свою "мегаструктуру" и ее заполнять, так можно передавать структуру (по ссылке!) между процедурами, не нарушая последовательность элементов.
Автор: Андрей * ![Перейти к цитате Перейти к цитате](/forum2/Themes/soclean/icon_latest_reply.gif)
1. Нумерации с 0
Сработает и без этого, так как массив выше объявлен с нумерацией от 1. Хотя по общепринятым нормам соглашусь, что MSDN нумерует с нуля.
Автор: Андрей * ![Перейти к цитате Перейти к цитате](/forum2/Themes/soclean/icon_latest_reply.gif)
и почему name_info.cRDN := 1; ?
Как я понимаю, это количество субъектов. На первый взгляд все верно, субъект один, а у этого субъекта RDN из 5 компонентов.
Отредактировано пользователем 10 января 2022 г. 22:47:16(UTC)
| Причина: Не указана