Форум: "Основная";
Текущий архив: 2002.12.09;
Скачать: [xml.tar.bz2];
ВнизПередача строк из DLL в форму Найти похожие ветки
← →
Тормоззз (2002-11-29 14:34) [0]Мне надо, чтобы в DLL находились функции со строковыми параметрами, которые возвращали что-то типа array of string
(в общем могла вернуть 3, 4, 10 и т.д. строк)
Нужно использовать что-то вроде PChar???
Подскажите пожалуйста, желательно с небольшим примером!
← →
Юрий Федоров (2002-11-29 14:41) [1]Можно использовать PChar в формате "строки с разделителем #13#10",
а затем присваивать PChar в TStringList.Text, и наоборот получать PChar из TStringList.Text
← →
Тормоззз (2002-11-29 14:55) [2]Если не трудно, можно небольной примерчик? Как использовать PChar???
← →
FreeLancer (2002-11-29 15:05) [3]TStringList(TStrings) + sharemem
← →
Юрий Федоров (2002-11-29 16:07) [4]Функция в ДЛЛ :
function DLLFunc : PChar;
begin
Result:=PChar(Strings.Text);
//Где Strings типа TStrings,
//только нужно следить за тем, чтобы при выходе
//из функции указатель был жив, т.е Strings
//не может быть локальной переменной
end;
Вызов из приложения
..
var SL : TStrings;
..
SL:=TStringList.Create;
Sl.TExt:=StrPas(DLLFunc);
...
SL.Free;
← →
Fantasist (2002-11-29 18:43) [5]
> //только нужно следить за тем, чтобы при выходе
> //из функции указатель был жив, т.е Strings
> //не может быть локальной переменной
При чем тут Strings? GetText возвращает временную переменную string. Правильнее говорить о валидности использования ее за пределами это функции. Лучше(мне так кажется надежнее):
function DLLFunc : PChar;
var
s:string;
begin
s:=Strings.Text;
GetMem(Result,Lenght(s)+1);//для нулевого символа
Move(pointer(s)^,Result^,Lenght(s)+1);
end;
Тогда правда клиентский код должен взять на себя функцию освобождения памяти. Можно, конечно, использовать и внутренний статический буффер:
var
s:string;
.............
function DLLFunc : PChar;
begin
s:=Strings.Text;
Result:=pointer(s);
end;
Тогда память будет освобождена автоматически. Такой подход, правда, ограничен количеством одновременного использования. Можно придумать и другие вариации, типа автоматичекий лист динамических буфферов.
← →
Юрий Зотов (2002-11-29 18:55) [6]ShareMem + callback.
Решает все проблемы с выделением/освобождением памяти.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.12.09;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.008 c