![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передача данных из DLL в главный процесс
DillerXX © (2005-11-16 23:53:00)Подскажите, как передать список, который формируется в ДЛЛ в главный процесс? Я пробовал записывать в файл из ДЛЛ - видимо кривые руки, но запись в файл работала криво :) Подскажите как получить некий массив в главное процессе...
Leonid Troyanovsky (2005-11-17 09:06:00) [1]
> DillerXX © (16.11.05 23:53)
> Подскажите как получить некий массив в главное процессе.
Приложение распределяет массив нужного размера и передает в
библиотеку его адрес и размер.
В случае, если библиотечная функция нуждается в увеличении
размера, то лучше передавать массив заведомо большего размера,
максимальный размер массива, а также его текущий размер.
{Это объявление одинаково в приложении и библиотеке}
type
TArrayX= array [0 .. MAXLONGINT div 8] of Longint;
PArrayX= ^TArrayX;
{Это процедура в библиотеке работает с массивом}
procedure Dosomething(var a: TArrayX; var size: Longint; const maxsize);
begin
{size <= maxsize}
..
end;
{Этот код работает в приложении}
var
p: PArrayX; // указатель на массив
..
GetMem(p, SizeOf(Longint)* MaxSize); // распределяем массив c запасом
..
DoSomething(p^, n, MaxSize); // передаем его для обработки в dll
{ n <= MaxSize }
..
FreeMem(p); // освобождаем массив
--
Regards, LVT.
Digitman (2005-11-17 08:34:00) [2]
> получить некий массив
> как передать список
Странного ты желаешь - ДЛЛ возвращает список, а тот кто вызвал ДЛЛ в результате получает с какого-то перепугу не список, а массив)
Ты уж определись как-нибудь, о чем идет речь - о списке или о массиве)
Если и хост-приложение (именно хост-приложение, а не какой-то там "главный процесс" !) и ДЛЛ собраны в Делфи одной и той же версии, то можно сделать так:
1.
в DLL:
function GetList: TList;
begin
Result := TList.Create;
..
end;
в хост-приложении:
function GetList: TList; external 'MyLib.dll';
var
List: TList;
..
List := GetList;
try
// работа с полученным списком
finally
List.Free;
end;
2. Оба проекта (И проект хост-приложения И проект DLL) собираются с установленнойопцией Build With Run-Time Packages