Vi
Проще всего передавать массив из VB как есть: или через Variant (VARIANT), или через Type() (SAFEAARRAY(Type)). И уж в С++ разбираться с этим массивом - там, по-моему, всего-то один-два оператора. Однако проблем с передачей точно не будет.
SAFEARRAY * psa = ... получить ...;
MY_TYPE * psadata = NULL;
HRESULT hr = ::SafeArrayAccessData(psa, (void**)&psadata);
А значение psa получать надо из SafeArrayCreate() ? А как ее юзать? И вообще, как это все работает?
Я тут подумал: VB ведь правильно передат массивы типа byte. Поэтому я переделал код формы так

:
- Код: Выделить всё
Private Type MY_TYPE
Name As String
Type As Long
Comment As String
Content As String
End Type
Private Declare Function TestFunc Lib "Test.dll" (ByRef Massiv As Byte) As Long
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Private Sub Form_Load()
Dim arr(2) As MY_TYPE
arr(0).Name = "1st array element text 1"
arr(0).Comment = "1st array element text 2"
arr(0).Type = 1
arr(0).Content = "1st array element text 3"
arr(1).Name = "2nd array element text 1"
arr(1).Comment = "2nd array element text 2"
arr(1).Type = 2
arr(1).Content = "2nd array element text 3"
arr(2).Name = "3rd array element text 1"
arr(2).Comment = "3rd array element text 2"
arr(2).Type = 3
arr(2).Content = "3rd array element text 3"
Dim i As Long
ReDim byte_arr(Len(arr(0)) * (UBound(arr) + 1)) As Byte
For i = 0 To UBound(arr)
CopyMemory byte_arr(Len(arr(0)) * i), arr(i), Len(arr(0))
Next i
Call TestFunc(byte_arr(0))
End Sub
Т.е. передаю в функцию, которая ждет указатель типа MY_TYPE, указатель на BYTE. Запускаю и смотрю что получилось... А получилось так, что почему-то все ячейки саммива заняты ТРЕТЬИМ ЭЛЕМЕНТОМ!!!!!

Т.е. в Watch1 все 3 элемента массива одинаковы и содержат:
"3rd array element text 1"
"3rd array element text 2"
3
"3rd array element text 3"
В чем дело?
