|
Массив из ДЛЛ
|
|||
---|---|---|---|
#18+
Добрый день, уважаемые!!! Есть ДЛЛ, написанная на Delphi. В ней есть процедура, которая возвращает указатель на массив. В Delphi ее вызвать просто Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25.
Хотелось бы вызывать ее в VBA. В гугле искал, ничего внятного не нашел. Может быть, все просто, но я в VBA не силен. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2012, 14:45 |
|
Массив из ДЛЛ
|
|||
---|---|---|---|
#18+
Ничего не просто. Во-первых, VB не очень-то дружит с указателями, во-вторых, совсем не знаком с дельфевыми массивами. Если будет указатель хотя бы на SAFEARRAY, то с этим уже можно как-то работать. В противном случае для vb это указатель на байтовый массив неизвестной величины. Если вы знаете, что представляют из себя дельфевые массивы в памяти в "сыром" виде, если они хранят и свой размер как SAFEARRAY, можете попытаться раскодировать эти байты. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2012, 15:10 |
|
Массив из ДЛЛ
|
|||
---|---|---|---|
#18+
авторНичего не просто. Во-первых, VB не очень-то дружит с указателями, во-вторых, совсем не знаком с дельфевыми массивами. Если будет указатель хотя бы на SAFEARRAY, то с этим уже можно как-то работать. В противном случае для vb это указатель на байтовый массив неизвестной величины. Если вы знаете, что представляют из себя дельфевые массивы в памяти в "сыром" виде, если они хранят и свой размер как SAFEARRAY, можете попытаться раскодировать эти байты. Хорошо, а если размер массива и тип данных известен? В данном случае - Long. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2012, 15:29 |
|
Массив из ДЛЛ
|
|||
---|---|---|---|
#18+
Можно попробовать так: Dim arr(0 to размер_массива) as Long CopyMemory arr(0), указатель, размер_массива * 4 ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2012, 16:15 |
|
Массив из ДЛЛ
|
|||
---|---|---|---|
#18+
Можно SAFEARRAY и на стороне VB/VBA заполнить. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2012, 16:29 |
|
Массив из ДЛЛ
|
|||
---|---|---|---|
#18+
Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Нули выдает, а должны быть значения. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2012, 16:47 |
|
Массив из ДЛЛ
|
|||
---|---|---|---|
#18+
Абкт, как-то совсем плохо выглядит. 1) Option Explicit 2) Описать в Declare aParr As Long 3) Описать в процедуре переменную, которая будет принимать адрес первого элемента массива. 4) Вызвать-таки MInit. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2012, 16:54 |
|
Массив из ДЛЛ
|
|||
---|---|---|---|
#18+
Даже ещё хуже. MInit не возвращает (адрес начального элемента массива), а принимает по значению адрес array of Integer. Каша, короче. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2012, 16:58 |
|
Массив из ДЛЛ
|
|||
---|---|---|---|
#18+
Если дельфевый Integer = вбшный Integer, то * 2. Я почему-то подумал, что Long. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2012, 17:45 |
|
Массив из ДЛЛ
|
|||
---|---|---|---|
#18+
Antonariy, это, кажется, в первых версиях Дельфи Integer был generic-ом, и мог выбираться 16/32, сейчас вроде 32-битный (если снова не generic 32/64). Абкт, короче, пробуй так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Но MInit должна корректно работать с массивом, не выходя за его границы. Если она это делает, ориентируясь на High(), то вряд ли что-то хорошее выйдет. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2012, 18:11 |
|
|
start [/forum/topic.php?fid=60&fpage=86&tid=2158104]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 355ms |
total: | 481ms |
0 / 0 |