Я пробовал через CallWindowProc машинным кодом, но в VB это работает крайне нестабильно (через 2 на 3-й). Да и не только это. Некоторые значения возвращяются нормально, некоторые нет.
Например копирование с помощью CopyMemory по psa всегда выдаёт неверные результаты. GetMem тоже не срабатывает. Даже API из OLEAUT32.DLL не работают.
Может я не там копаю? Вобщем мне нужно передать массив по ссылке в модуль класса.
Во всяком случае мне удалось написать код, который возвращает элементы(не саму структуру) типа SAFEARRAY.
- Код: Выделить всё
'Указатель на psa
MOV EBX,[EBP+8]
'Сам psa
MOV EAX,[EBX]
'Function=SAFEARRAY.Член
MOV EAX,[EAX+Позиция элемента]
И указатель на нужный мне элемент массива
- Код: Выделить всё
;http://basicproduction.nm.ru/ASM/LASM
;Element address
;1-Array [EBP+8] (Указатель на psa)
;2-Index [EBP+12] (VarPtr)
;3-Long variable [EBP+16] (VarPtr)
;4-SafeArrayGetElement [EBP+20] (Получен с помощью GetProcAddress)
Const Array EQU [EBP+8]
Const Psa EQU EBX
Const Index EQU [EBP+12]
Const EPtr EQU [EBP+16]
Const SafeArrayGetElement EQU [EBP+20]
MOV Psa,Array
MOV Psa,[Psa]
PUSH EPtr
PUSH Index
PUSH Psa
CALL SafeArrayGetElement
В результате этих действий адрес первого байта элемента массива, указанного в Index ([EBP+12]) возвращается в EPtr ([EBP+16]).
А этот код ведёт себя нестабильно, т.е. не всегда возвращает верный адрес.
- Код: Выделить всё
'Указатель на psa
MOV EBX,[EBP+8]
'Сам psa
MOV EAX,[EBX]
И вызов SafeArrayGetElement из VB возвращает неверный адрес.