типичный вопрос по dll

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Сообщение badaninslava » 13.01.2006 16:32:21

Как в dll передать массив строк переменной длины?
Хочу передать в dll список файлов...
badaninslava
постоялец
 
Сообщения: 101
Зарегистрирован: 12.12.2005 01:21:44

Сообщение Иван Шихалев » 13.01.2006 16:48:14

DLL своя? Будет работать только со своими программами?
Если так, то можно передавать динамический массив из длинных строк: array of ansistring
Чтобы не было проблем с памятью см. статью <a href='http://freepascal.ru/article//freepascal/20050522025034/' target='_blank'>«Разделяемая память в FPC»</a>
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Сообщение PVOzerski » 13.01.2006 16:55:37

Тут много "приятного". Во-первых, лучше бы обойтись без передачи классов.
Тогда остается массив. Какой массив и каких строк? Более-менее универсальный вариант вот такой:

type
TStrList = array[0..0] of PChar;
PStrList = ^TStrList;

procedure GetStrings(ACount: integer; AList: PStrList); export;

Пример:

const
MyList: array[1..3] of PChar = ('One', 'Two', 'Three');
begin
GetStrings(3, PStrList(@MyList));


1) Естественно, освобождать память должен тот же модуль, который ее выделял.
2) Вместо PChar можно использовать и ShortString. Работа же со "штатными" динамическими массивами и длинными строками требует общего менеджера памяти для обоих модулей. Подробнее - см. доку на этом же сайте.
PVOzerski
постоялец
 
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб

Сообщение badaninslava » 13.01.2006 17:37:24

Спасибо!!!
Мне тут посоветовали:
Код: Выделить всё
program Untitled;
uses Classes, Math;
procedure MyDllProcedure(St:Widestring);
 external 'DLL.dll' name 'MyDllProcedure';
var S:Widestring;
   i:integer;
   tmpStr: TStringList;
begin
 tmpStr := TStringList.Create;
 for i :=0  to 10 do tmpStr.Add(IntToStr(i));
 S := tmpStr.Text;
 tmpStr.Free;
 MyDllProcedure(S);
end.

library Untitled;
uses Windows, Classes, SysUtils;

procedure MyDllProcedure(AStr:WideString); export;
var i:integer;
tmpStr: TStringList;
begin
 tmpStr := TStringList.Create;
 tmpStr.Text := AStr;
 for i :=0  to tmpStr.Count-1  do
  MessageBox (0, PChar(tmpStr.Strings[i]) , 'URA!!!', 0 + MB_ICONEXCLAMATION);
 tmpStr.Free;
end;

exports
 MyDllProcedure;

begin

end.

Всё работает!!! :)

Но только тут никаких ограничений нет? Вы не в курсе?
badaninslava
постоялец
 
Сообщения: 101
Зарегистрирован: 12.12.2005 01:21:44

Сообщение PVOzerski » 13.01.2006 18:22:20

Лучше бы тогда уж передавать PWideChar - во избежание недоразумений.
PVOzerski
постоялец
 
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб

Сообщение badaninslava » 13.01.2006 19:39:19

Лучше бы тогда уж передавать PWideChar - во избежание недоразумений.

В смысле? Что такое PWideChar? Для чего?
badaninslava
постоялец
 
Сообщения: 101
Зарегистрирован: 12.12.2005 01:21:44

Сообщение Иван Шихалев » 16.01.2006 08:18:12

Что такое PWideChar? Для чего?


Чтобы не было недоразумений с управлением памятью — память под PWideChar управляется явным образом.
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16

Рейтинг@Mail.ru