Библиотека сделана на C. Пытаюсь её адаптировать к VB.
Возникла следующая проблема.
Имеется функция GetDvInfo.
9.4.4 Получение списка ключей, загруженных в драйвер
Получение списка ключей, загруженных в драйвер, производится при помощи функции(wbotho,wsigno):
T16bit WINAPI GetDrvInfo(USR_KEYS_INFO *Keys_Info,
unsigned long *n_Key_Slot);
Параметры:
(o) Keys_Info - указатель на массив из 16 структур USR_KEYS_INFO, куда будет возвращена информация о слотах драйвера, в которые прогружены ключи для шифрования и/или подписи (CKD и/или CKDI). Память под массив резервируется пользователем.
(o) n_Key_Slot - возвращаемое количество загруженных слотов (может быть равно нулю, в том случае, когда была произведена выгрузка всех ключей).
Функция в начале работы обнуляет весь массив структур Keys_Info, а затем последовательно заполняет его информацией о найденных загруженных слотах в порядке возрастания их номеров. (В Keys_Info[0] записывается информация о первом найденном загруженном слоте, в Keys_Info[1] — о втором, и т. д.)
Как видно из описания нужно передать указатель (как я понимаю ByRef) массива из 16 элементов. Элементами которого являются структуры USR_KEYS_INFO. Нашёл описание этой C структуры
typedef struct _USR_KEYS_INFO {
char num[11];
char nump[13];
T16bit keys_status;
T8bit version_high;
T8bit version_low;
T32bit KeySlotNumber;
} USR_KEYS_INFO, *PUSR_KEYS_INFO;
Наивно предположил, что смогу сделать нечто типа:
- Код: Выделить всё
Private Type
num as String * 11
nump as String * 13
keys_status as ....
version_high as ....
version_low as ....
KeySlotNumber as ....
End Type
Dim KEYS_INFO(16) as USR_KEYS_INFO
Наверняка ошибаюсь. Упёрся в незнание как создать такую структуру с такими типами данных и даже сотворить тот же указатель на "unsigned long *n_Key_Slot" (второй параметр фунции) для меня вызвало сложность. Обычный DWORD в C и Long в VB приблизительно понятно, но вот беззнаковый Long сотворить в VB не преставляю как.
Вообще представляю себе решение так - с помощью API выделить кусок памяти под загрузку структуры через GlobalAlloc. Передать его функции, а затем в VB-ке через API GetMem4 попытаться по смещению надёргать из него эти данные.... Но наверняка опять что то не учитываю, т.к не имел опыта работы с этими функциями.
P.S Прошу сильно не пинать за возможно мегатупейшие предположения. )) (подсознательно ощущаю, что это бредовая мысль), но всё же - вдруг возможно как то с этим справиться ?
В общем жду любых советов и предложений Заранее очень благодарен.