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

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

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

Ответить
badaninslava
постоялец
Сообщения: 101
Зарегистрирован: 12.12.2005 00:21:44

Сообщение badaninslava »

Как в dll передать массив строк переменной длины?
Хочу передать в dll список файлов...
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

DLL своя? Будет работать только со своими программами?
Если так, то можно передавать динамический массив из длинных строк: array of ansistring
Чтобы не было проблем с памятью см. статью <a href='http://freepascal.ru/article//freepascal/20050522025034/' target='_blank'>«Разделяемая память в FPC»</a>
PVOzerski
постоялец
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб
Контактная информация:

Сообщение PVOzerski »

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

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. Работа же со "штатными" динамическими массивами и длинными строками требует общего менеджера памяти для обоих модулей. Подробнее - см. доку на этом же сайте.
badaninslava
постоялец
Сообщения: 101
Зарегистрирован: 12.12.2005 00:21:44

Сообщение badaninslava »

Спасибо!!!
Мне тут посоветовали:

Код: Выделить всё

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.

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

Но только тут никаких ограничений нет? Вы не в курсе?
PVOzerski
постоялец
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб
Контактная информация:

Сообщение PVOzerski »

Лучше бы тогда уж передавать PWideChar - во избежание недоразумений.
badaninslava
постоялец
Сообщения: 101
Зарегистрирован: 12.12.2005 00:21:44

Сообщение badaninslava »

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

В смысле? Что такое PWideChar? Для чего?
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

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


Чтобы не было недоразумений с управлением памятью — память под PWideChar управляется явным образом.
Ответить