Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: передача многомерного массива в dll Добавлено: 04.10.04 16:44  

Автор вопроса:  Paul
Подскажите, плиз...
как передавать двумерный массив в 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 - массив.

Вызов, например:
iRows = 5
iCols = 9
ReDim IncreaseStat(iRows, iCols)
lRet = Balance(IncreaseStat(0, 0), lRows, lCols, 7&)

т.е., как и с одномерным, передается первый элемент (начало) массива. Так ли это?

Ответить

  Ответы Всего ответов: 7  

Номер ответа: 1
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #1
Добавлено: 04.10.04 19:20
А bbext.dll тоже на VB написана или на чём другом?

Ответить

Номер ответа: 2
Автор ответа:
 Александр



Разработчик Offline Client

ICQ: 204034 

Вопросов: 106
Ответов: 1919
 Профиль | | #2 Добавлено: 04.10.04 19:41
А есть разница?

Ответить

Номер ответа: 3
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #3
Добавлено: 04.10.04 20:48
Можешь вот так объявить:
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

А есть разница?

 На VB принять сложно. См. выше.

Ответить

Номер ответа: 4
Автор ответа:
 Paul



Вопросов: 19
Ответов: 11
 Профиль | | #4 Добавлено: 05.10.04 11:58
фенкс за помощь.

bbext.dll написана на Delphi не мной.
(обычная, не ActiveX)
так уж разработчик постарался, что нужно
передать двумерный массив.

говорит, что данные видит нормально на входе, но
почему-то массив воспринимается как одномерный.
т.е. он собирается, видимо, читать массив указателей на одномерные массивы, а это не так (?)
вообщем, фатальная ошибка приложения при вызове
его функции (защита по памяти).

Ответить

Номер ответа: 5
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #5
Добавлено: 05.10.04 14:33
 Скорее всего массивы по разному устроены в 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 или пусть не строит из себя крутого паскакальщика ;) Короче одномерного массива ему вполне хватит. Ему лень наверное в своём мусорном пасквиле ковыряться чтобы алгоритм переписать.

Ответить

Номер ответа: 6
Автор ответа:
 Paul



Вопросов: 19
Ответов: 11
 Профиль | | #6 Добавлено: 05.10.04 15:22
>>Пусть учит OLE API или пусть не строит из себя крутого паскакальщика ;)

блин, прямо в точку :)))

в том то и дело, не хочет он писать с OLE и всё...
библиотека писалась без ориентации на какой-нить
язык программирования, просто dll.
Точнее, она должна работать на 3 языках (C++, Delphi, VB), для интерфейса пользователя.
там ещё есть пару других функций, куда из VB без особого
труда передаются и одномерный массив и массив структур (польз. типов). Всё работает, и я даже не вдавался как.
А двумерный чего -то не работает.
на вход он принимает указатель (PChar).
имхо, в этом случае ведь должно быть
всё равно что за массив. в памяти всё пойдёт последовательно и главное соблюсти размер байтов..

додумался проверить под C++ Builder
тоже не пашет эта функция, другие работают!
имхо, глюки в лайбрари :))

спасибо за помощь! :)

Ответить

Номер ответа: 7
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #7
Добавлено: 05.10.04 23:11
Точнее, она должна работать на 3 языках (C++, Delphi, VB)

 Скажи пусть VB вычёркивает. Не в первой ведь. Пусть поддерживает только истинные языки программирования фирмы Борланд ;)

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам