Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.009 c
3-27805
DiamondA
2002-11-22 07:39
2002.12.09
InterBase and TerminalService??????????


4-28330
sen
2002-10-24 15:17
2002.12.09
Не обновляется иконка


1-27962
Mosh
2002-11-28 23:50
2002.12.09
Зиг Хайль!!


1-27946
Кокандокало
2002-11-29 12:05
2002.12.09
Exceptions и SocketError


1-27967
Andy78
2002-11-27 16:35
2002.12.09
MDI StatusBar и Application.OnHint





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский