Интересный и полезный косяк с кастованием: массивная переменная (являющаяся указателем на SafeArrayDescriptor) воспринимается как просто обычная Long-переменная, хранящая число. Соответственно возвращается Not от значения этой переменной. Если поставить ещё один Not, то будет опять нормальное значение переменной.
Фишка в том, что вместо просто переменной у нас массивная-переменная, и вместо просто значения — указатель на SA-дескриптор. Таким образом:
- Код: Выделить всё
Dim SomeArray() As Long
ReDim SomeArray(33) As Long
AddressOfSafeArrayStructure = Not (Not SomeArray) ' вся фишка
Особо невереющие могут получить адрес массивной переменной и с помощью GetMem4 прочитать оттуда значение — уверяю, будет то же самое, что и Not(Not(...))
Обратимся к статье GSerg'а
Сущность массивов в VB. Там автор для получения адреса SA-дескриптора использует следующий код:
Там для этой цели используется вызов VarPtr (через Declare), а затем GetMem4 (тоже через Declare), что катастрофически долго и громоздко, по сравнению с нашим вариантом.
Фактически, мы читаем значение переменной одной лишь инструкцией процессора (как и полагается), а не вызовом двух функций, которые к тому же надо резолвить.
Красота, одним словом.
Vi респект за обнаруженный косяк.