Страница: 1 |
Страница: 1 |
Вопрос: Как получить строку из внешней DLL ?
Добавлено: 11.11.04 15:09
Автор вопроса: avkiev | ICQ: 226072
Помогите, плиз, совсем запутался.
Есть внешняя DLL на Дельфи, там есть такая функция:
function GetSt(): string; stdcall;
begin
Result := 'abc';
end;
В своей проге я объявляю ее так:
Private Declare Function SetSt Lib "mydll.dll" () As String
а вызываю так:
Dim s as String
s = GetSt()
Не хочет работать, вываливается прога. Что я делаю неправильно ?
Ответы
Всего ответов: 13
Номер ответа: 1
Автор ответа:
Nash Bridges
Вопросов: 5
Ответов: 139
Профиль | | #1
Добавлено: 11.11.04 15:50
Проще всего:
begin
Result := WideString('abc');
end;
Private Declare Function GetSt Lib "mydll.dll" () As Variant
или PCHAR с размером буфера.
Номер ответа: 2
Автор ответа:
avkiev
ICQ: 226072
Вопросов: 48
Ответов: 107
Профиль | | #2
Добавлено: 11.11.04 16:04
Большое спасибо, все получилось
Номер ответа: 3
Автор ответа:
avkiev
ICQ: 226072
Вопросов: 48
Ответов: 107
Профиль | | #3
Добавлено: 11.11.04 16:26
э нет...
Вариант с Variant'ом увеличил dll-ку с 25К до 75К.
Без Variant'а никак нельзя обойтись ?
Номер ответа: 4
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #4
Добавлено: 11.11.04 17:53
А что это ты задекларировал GetSt, а вызываешь SetSt? Может вернуться к безвариантному способу, просто указать правильно имя ф-ции?
И чё она такая огромная : 25кБ?
Номер ответа: 5
Автор ответа:
avkiev
ICQ: 226072
Вопросов: 48
Ответов: 107
Профиль | | #5
Добавлено: 11.11.04 18:03
не, то просто очепятка.
Дык в этой длл не одна эта функция, а еще куча...
Номер ответа: 6
Автор ответа:
Nash Bridges
Вопросов: 5
Ответов: 139
Профиль | | #6
Добавлено: 11.11.04 18:23
string не получиться. это дельфевая строка.
pchar попробуй и размер ее передавай.
Номер ответа: 7
Автор ответа:
avkiev
ICQ: 226072
Вопросов: 48
Ответов: 107
Профиль | | #7
Добавлено: 11.11.04 18:38
неа, не выходит каменный цветок
Можешь код с pChar привести ?
Номер ответа: 8
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #8
Добавлено: 11.11.04 19:51
avkiev
Может как я делаю сделать: просто делаю пустой буфер определенной длины и передаю его в dll ByVal, т.е. в dll приходит указатель на начало буфера. В dll я его заполняю данными и всё. Ничего не возвращаю. Просто забил vb-шный буфер. А по возвращении в программу читаю этот буфер как обычно.
Номер ответа: 9
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #9
Добавлено: 12.11.04 09:05
Как это передаешь буфер ByVal? Массив передаешь по значению? Это не гон однако? Или ты его как ByVal VarPtr(Buffer(0))?
Номер ответа: 10
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #10
Добавлено: 12.11.04 09:08
Самый оптимальный, думается, вариант - задавать буффер - массив байт - некоторой длины, скажем 255 байт, передавать указатель на него в dll по ByRef, а сама функция будет возвращать длину строки, записанной в буфер. Как правило, строка бывает меньше 255 байт.
Номер ответа: 11
Автор ответа:
avkiev
ICQ: 226072
Вопросов: 48
Ответов: 107
Профиль | | #11
Добавлено: 12.11.04 10:49
Да, с буфером - работает.
Но некрасиво это, не эстетично
Ну и фиг с ним: главное - чтоб работало !
Номер ответа: 12
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #12
Добавлено: 12.11.04 11:03
Ну а раз с буфером работает, то и со String должно. Просто передавай его в
Dll-ку ByVal lpString as String, а в самой длл работай со строкой как с
буфером. Только перед вызовом сделай что-то вроде String=Space(255).
Номер ответа: 13
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #13
Добавлено: 12.11.04 14:02
Но некрасиво это, не эстетично
Хе, если ты эстет, пиши на ассемблере, вот тогда будет действительно красивый код. Будешь получать настоящее эстетическое наслаждение.
P.S. По возвращении буфера отсекай лишние нули, оставшиеся в буфере. Так надёжней, чем потом искать, в чём проблемы.