Главная страница
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-28004
GooRoo
2002-11-29 21:19
2002.12.09
масштабируемость приложения


6-28178
TsaturSoft
2002-10-14 22:36
2002.12.09
Hyper Terminal


4-28350
Dark Simpson
2002-10-25 23:54
2002.12.09
RESIZING ОКНА


3-27823
Veronika
2002-11-20 13:45
2002.12.09
Временные таблицы в IB


1-27953
Nadine
2002-11-29 12:21
2002.12.09
Как содержимое поля BLOB перенести в файл *.doc или *.xls