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

Вниз

Передача строк из 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.019 c
1-27945
@Ujin
2002-11-27 15:35
2002.12.09
AtiveX формы, COM и т.п....


3-27874
ScareCrow
2002-11-14 13:02
2002.12.09
Проблема с параметром компонента TQuery ()


14-28279
Cr@sh
2002-11-19 14:21
2002.12.09
Подскажите с чего начать...


14-28219
Step[B.M.]
2002-11-16 18:02
2002.12.09
Среднестатистический возраст посетителей форума !


7-28314
KPV-10k
2002-10-07 22:02
2002.12.09
Вырубить монитор