Главная страница
    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.008 c
1-27939
Кокандокало
2002-11-27 22:54
2002.12.09
Я в глубоком шоке.... TStrings


3-27898
Alexey Goosev
2002-11-21 22:44
2002.12.09
Нид хелп!!!Зверски разрастается dbt файл (мемо-поля) dBase 4 базы


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


1-27994
ЮРИЙ_К
2002-11-29 15:55
2002.12.09
Отловить на Гриде клик правой кнопки мыша ???


6-28168
alex_ustasu
2002-10-11 12:02
2002.12.09
ClientSocket->ServerSocket. Не вызывается ClientSocketError





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