Как в dll передать массив строк переменной длины?
Хочу передать в dll список файлов...
типичный вопрос по dll
Модератор: Модераторы
- Иван Шихалев
- энтузиаст
- Сообщения: 1138
- Зарегистрирован: 15.05.2006 11:26:13
- Откуда: Екатеринбург
- Контактная информация:
-
PVOzerski
- постоялец
- Сообщения: 109
- Зарегистрирован: 19.05.2005 13:45:10
- Откуда: СПб
- Контактная информация:
Тут много "приятного". Во-первых, лучше бы обойтись без передачи классов.
Тогда остается массив. Какой массив и каких строк? Более-менее универсальный вариант вот такой:
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. Работа же со "штатными" динамическими массивами и длинными строками требует общего менеджера памяти для обоих модулей. Подробнее - см. доку на этом же сайте.
Тогда остается массив. Какой массив и каких строк? Более-менее универсальный вариант вот такой:
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
Спасибо!!!
Мне тут посоветовали:
Всё работает!!!
Но только тут никаких ограничений нет? Вы не в курсе?
Мне тут посоветовали:
Код: Выделить всё
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 00:21:44
- Иван Шихалев
- энтузиаст
- Сообщения: 1138
- Зарегистрирован: 15.05.2006 11:26:13
- Откуда: Екатеринбург
- Контактная информация:
