Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.10.16;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.01 c
1-51206
VaS
2003-10-04 13:41
2003.10.16
GDI+ и печать


14-51473
Juster~Thunderbird
2003-09-29 20:09
2003.10.16
Мой бедный ASUS CD-RW


1-51308
Samael6
2003-10-06 12:27
2003.10.16
Пакеры


1-51326
ss300
2003-10-06 07:23
2003.10.16
Удаление строки в текстовом файле


14-51522
Gluh
2003-09-27 11:52
2003.10.16
Win XP SP2 вышел?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский