передача параметров
От: SkyP Великобритания  
Дата: 01.12.03 14:19
Оценка:
суть проблемы:

есть длл написанная на Дельфи,
вызываеться из VB
проблема с возвратом параметра из длл
крах происходит при возврате строки из длл

вопрос:
какие методы кроме вызова функции есть для решения проблемы передачи данных
из внешнего модуля
1. функция видать непойдет
2. automatation object


подскажите кто с таким боролся
Re: передача параметров
От: black hermit Россия  
Дата: 01.12.03 15:36
Оценка:
Здравствуйте, SkyP, Вы писали:

SP>суть проблемы:


SP>есть длл написанная на Дельфи,

SP>вызываеться из VB
SP>проблема с возвратом параметра из длл
SP>крах происходит при возврате строки из длл

SP>вопрос:

SP>какие методы кроме вызова функции есть для решения проблемы передачи данных
SP>из внешнего модуля
SP>1. функция видать непойдет
SP>2. automatation object


SP>подскажите кто с таким боролся


Все дело в разности представления строк у Delphi и VB
У VB это BSTR (Unicode строка), у Delphi PChar (указатель на массив Char) с нулевым (NULL) завершением строки

Десларим Функцию:

Public Declare Function "SomeFunc" Lib "MyLib" (ByVal retString as String, ByRef StrLen as Long) as Long
Передача строки должна быть по значению (ByVal) ибо имя строковой переменной, это итак указатель, а нам надо передать указатель на первый элемент


Создаем массив CHAR в VB

Private ReturnedString as String * SOME_CONSTANT


И вызывает функцию
Dim lenght as Long
lenght = SOME_CONSTANT
SomeFunc(ReturnedString, lenght)


Всё. Мы имеем null terminated массив символов, который легко преобразовать в String.
The darkness around me
Shores of solar sea
Oh how i wish to go down with the sun....
Re: передача параметров
От: Dagobert  
Дата: 04.12.03 01:53
Оценка:
Посмотреть бы объявление вызываемой функции.
А так могу посоветоввать две вещи.
1. Объявить ByVal ... As String
2.
-Объявить байтовый массив.
-В функции объявить ... As Any. Если не ошибаюсь тогда параметр передаётся по ссылке, и по заверщению функции в него набъётся информация. Только массив надо сначала объявить без размерности Dim A(), а потом изменить размер на нужный Redim A(100).
Больше без кода сказать не могу.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.