Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.16;
Скачать: CL | DM;

Вниз

DLL и строки   Найти похожие ветки 

 
d.u.k.e   (2003-10-02 01:40) [0]

Мастера, подскажите как заставить DLL возвращать список строк переменного объема?


 
Ihor Osov'yak ©   (2003-10-02 01:58) [1]

Способов много есть.. Наиболее традиционный - вызывающая сторона формирует буффер, в процедуру передается указатель на этот буффер, его размер. Процедура помещает в буффер тело строк, следя за тем, чтобы не выйти за преледы буффера. Также используктся еще одна переменная, которая говорит о том, сколько байт занимает результат. Если буффер мал - то строки или усекаются, или вооще не передаются - это смотря какие ты соглашения сделаешь. А в "еще одной переменной" оказывается нужный размер буффера. Тогда делается еще раз вызов, с уже нужным буффером. Довольно часто при перврм вызове вообще передается буффер нулевого размера - это критерий для процедуры, что она пеердачу делать не должна, а должна только сообщить нужный размер буффера..

Примерно так:

procedure GetStrs(aBuf: pointer; aMaxSizeBuf: dword; var aNeedSize: dword);

юзаем:
var buff:pointer;
nb: dword;
...
GetStrs(nil, 0, nb); // запрашиваем размер
GetMem (buff, nb); // резервуем буфффер
GetStrs(buff, nb, nb); // получаем результат
... // здесь обрабатываем результат в буффере
FreeMem(buff); // освобождаем буффер

Зы - само собой, как строки будем разделять в буффере.. Тоже, можно по разному.. Как правило - символ(или символы разделители), хотя бы тот же CL, довольно часто используют #0, иногда в конце также ставят специальный символ..


 
d.u.k.e   (2003-10-05 01:29) [2]

Большое спасибо за ответ. А нельзя ли как нибуть попроще. Например TStringList как нить заюзать?


 
Palladin ©   (2003-10-05 01:52) [3]

можно и попроще

в dll

function GetStrings:string;
var
stringlist:TStringList;
begin
....
stringlist.Delimiter:=#8;
Result:=stringlist.DelimitedText;
end;

в приложении
var
stringsfromdll:tstringlist;
getstrings:function :string;
....
stringsfromdll.Delimiter:=#8;
stringsfromdll.DelimitedText:=GetStrings;

только sharemem не забудь указать везде или пользуйся pchar



Страницы: 1 вся ветка

Текущий архив: 2003.10.16;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.019 c
14-51514
Igor_thief
2003-09-27 14:07
2003.10.16
MDI


3-51094
Signed
2003-09-26 00:42
2003.10.16
Помогите разобраться новичку в БД


1-51297
Seldon
2003-10-05 22:00
2003.10.16
TPropertyEditor


3-51072
Filat
2003-09-25 19:47
2003.10.16
Как программно определить какая версия сервера?


14-51434
Dmitriy O.
2003-09-29 16:13
2003.10.16
Вопрос только для самых умных (тест интеллекта)