Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 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
Проще всего:

function GetSt(): Variant; stdcall;
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. По возвращении буфера отсекай лишние нули, оставшиеся в буфере. Так надёжней, чем потом искать, в чём проблемы.

Ответить

Страница: 1 |

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



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