Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Передача данных из 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


Наверх

Титульная страница Поиск, карта сайта Написать письмо