Подскажите, плиз...
как передавать двумерный массив в dll-ку из VB?
правильно ли следующее?
объявления:
'динамический двумерный массив, dll-кой не модифицируется
Public IncreaseStat() As Long
'функция
Public Declare Function Balance Lib "bbext.dll" (arZ As Long, ByVal lnPer As Long, ByVal lnInv As Long, ByVal lxT As Long) As Long
'arZ - массив.
Можешь вот так объявить:
Public Declare Function Balance Lib "bbext.dll" (arZ() As Any, ByVal lnPer As Long, ByVal lnInv As Long, ByVal lxT As Long) As Long
Тогда в библиотеку передастся указатель на указатель на SAFEARRAY. Его член pvData указывает на данные массива.
Я даже пример делал на эту тему. Смотри по ссылке
http://masmforum.com/viewtopic.php?t=4160
bbext.dll написана на Delphi не мной.
(обычная, не ActiveX)
так уж разработчик постарался, что нужно
передать двумерный массив.
говорит, что данные видит нормально на входе, но
почему-то массив воспринимается как одномерный.
т.е. он собирается, видимо, читать массив указателей на одномерные массивы, а это не так (?)
вообщем, фатальная ошибка приложения при вызове
его функции (защита по памяти).
Скорее всего массивы по разному устроены в VB и Delphi. VB работает с массивами через OLE API.
Где предполагалось изначально использовать эту библиотеку? В VB или в Delphi? Если он писал её специально для тебя, то пусть переписывает, а если под Delphi то тоже .
Вобщем VB ни с чем не совместим кроме себя любимого. Ответ я тебе уже отписал раньше. По теории добавить нечего. А по практике ты и не спрашивал.
Передавай массив по ссылке как я писал выше, а в Дельфи нужно обработать указатель и по нему выйти на структуру SAFEARRAY. Данные многомерного массива хранятся в памяти в таком порядке:
Допустим есть массив Array(5,5)
Есть указатель на данные массива. Это SAFEARRAY.pvData
Если считывать последовательно данные, то нужно написать простенький алгоритм доступа.
pvData + n, где n
0 - Array(0,0)
4 - Array(1,0)
8 - Array(2,0)
12 - Array(3,0)
16 - Array(4,0)
20 - Array(5,0)
24 - Array(0,1)
28 - Array(1,1)
32 - Array(2,1)
и т.д.
Пусть учит OLE API или пусть не строит из себя крутого паскакальщика Короче одномерного массива ему вполне хватит. Ему лень наверное в своём мусорном пасквиле ковыряться чтобы алгоритм переписать.
>>Пусть учит OLE API или пусть не строит из себя крутого паскакальщика
блин, прямо в точку ))
в том то и дело, не хочет он писать с OLE и всё...
библиотека писалась без ориентации на какой-нить
язык программирования, просто dll.
Точнее, она должна работать на 3 языках (C++, Delphi, VB), для интерфейса пользователя.
там ещё есть пару других функций, куда из VB без особого
труда передаются и одномерный массив и массив структур (польз. типов). Всё работает, и я даже не вдавался как.
А двумерный чего -то не работает.
на вход он принимает указатель (PChar).
имхо, в этом случае ведь должно быть
всё равно что за массив. в памяти всё пойдёт последовательно и главное соблюсти размер байтов..
додумался проверить под C++ Builder
тоже не пашет эта функция, другие работают!
имхо, глюки в лайбрари )