Главная страница
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.02 c
14-28294
_Alex
2002-11-19 00:17
2002.12.09
9999?


7-28320
Евген
2002-10-07 13:10
2002.12.09
Включение / выключение монитора


3-27798
Kolyan
2002-11-20 14:02
2002.12.09
Как программно получить список таблиц в BD


1-28088
antoniz
2002-11-28 10:04
2002.12.09
Подскажите по QuickReport


1-28025
DN
2002-11-29 12:49
2002.12.09
Работа с INI