Мне необходимо динамически формировать массив вот таких структур, заполнить их значениями и указателями на данные, а затем передавать указатель на него Сишной функции C_FindObjectsInit.
- Код: Выделить всё
typedef struct CK_ATTRIBUTE {
CK_ATTRIBUTE_TYPE type;
CK_VOID_PTR pValue;
CK_ULONG ulValueLen;
} CK_ATTRIBUTE;
Саму структуру в VB-ый вид я преобразовал:
- Код: Выделить всё
Public Type CK_ATTRIBUTE
lType As Long
lValue As Long
lValueLen As Long ' '/* in bytes' */
End Type
Казалось бы дальше достаточно сделать:
- Код: Выделить всё
Dim aTemplate(3) as CK_ATTRIBUTE
и вроде бы всё отлично. Но беда в том, что в этих структурах нужно ещё заполнить все 3 элемента
type - Long значение атрибута (1,2,3,4 и т.п),
pValue - Long указатель на данные
pValueLen - Long значение размера хранимых данных по указанному выше адресу
Таким образом структура атрибута может ссылаться на любой тип данных: строку, число, байтовый массив.
Мне нужно сделать нечто типа Class обёртки для динамического построения этого шаблона.
Подумав, предположил что необходим метод SetAttribute(ByVal AttributeType, AttributeValue as Variant).
Бодро начал заполнять коллекцию значениями, чтобы потом через VarPtr и StrPtr подсунуть указатели на них в структуры. Уже и код написал.
- Код: Выделить всё
....
.aTemplate(i).lValue = VarPtr(oColl(i))
...
Ан не работает. Поскрипев мозгами сообразил, что так я получаю указатель на временный буфер и логично что так работать не будет. Т.к он очищается.
В общем тупиковая ситуация. Знаний не хватает, чтоб с этим справиться. Понимаю, что объяснил сумбурно, поэтому если кто-то готов помочь, буду рад пояснить в чём проблема более подробно...
P.S Пока пришёл к выводу, что нужно создавать отдельный Byte() массив, в него копировать все значения атрибутов друг за другом, а в структуры передавать указатель на начало и длину данных внутри этого массива, т.к не представляю как сослаться через VarPtr / StrPtr на данные внутри коллекции..