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

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

DLL и TList [D6, D7, Win95/98, WinXP]


КК ©   (2005-08-29 11:37:00) 

Я создаю библиотеку DLL:

library io;

uses
 SysUtils,
 Classes, …;

Type Tmeas = record T : integer; par : single; end;
    Pmeas = ^Tmeas;

{$R *.res}

procedure ReadArray (Filename : string; MeasArray : TList);
var MeasVar : Pmeas; …
begin
 …
 while …
   New(MeasVar);
   MeasVar^.t := …; MeasVar^.par := …;
   MeasArray.add(MeasVar);
 End;
 …
end;

procedure EraseArray (MeasArray : TList);
var i : integer; MeasVar : PMeas;
begin
 if MeasArray.Count > 0 then
 begin
   for i := 0 to MeasArray.Count-1 do
   begin
     MeasVar := MeasArray[i];
     Dispose(MeasVar);
   end;
 end;
end;

exports
 ReadArray, EraseArray;
begin
end.


Потом обращаюсь к ней:

…
type
 TReadArray = procedure (Filename : string; MeasArray : TList);
 TEraseArray = procedure (MeasArray : TList);

 TMeas = record t : integer; par : single; end;
 PMeas = ^TMeas;

var LibHandle : integer;
 ReadArray : TReadArray; MeasArray : TList; MeasVar : PMeas; i : integer;
 EraseArray : TEraseArray;
begin
 LibHandle := LoadLibrary('io.dll');

 if LibHandle = 0 then begin ShowMessage ('Библиотека не загружена'); halt; end;

 @ReadPar1 := GetProcAddress(LibHandle,'ReadPar1');
 @ErrorReadPar1 := GetProcAddress(LibHandle,'ErrorReadPar1');
 @EraseArray := GetProcAddress(LibHandle,'EraseArray');

 MeasArray := TList.create;

 if not(@ReadPar1 = nil) and not(@EraseArray = nil) then
 begin
   ReadArray(Edit1.Text, MeasArray);
   if MeasArray.Count > 0 then
   begin
     …
   end;
   EraseArray(MeasArray);
 end;
 
 MeasArray.Free;

 FreeLibrary(LibHandle);

end;


При выполнении  FreeLibrary возникает ошибка: Access violation at address… Я склонна думать, что это связано со списком, передаваемом в качестве параметра. Как мне решить эту проблему?


Гаврила   (2005-08-29 12:36:00) [1]

Если оба проекта собраны с опцией Build With Run-Time Packages  = False, крайне желательно непередавать параметром TList (впрочем как и любой другой экземпляр класса)


Digitman   (2005-08-29 12:19:00) [2]

можно и Sharemem не включать, если соблюдены след.условия :

1. проекты хост-приложения и dll сверстаны в одной и той же версии Делфи-среды

2. оба проекта собраны с опцией Build With Run-Time Packages = True


КК   (2005-08-29 12:14:00) [3]

Спасибо, действительно, у меня сначала стоял тип PChar вместо string, поэтому я и не использовала ShareMem (комментарий читала). А потом поменяла на string, а ShareMem не включила.


Digitman   (2005-08-29 11:42:00) [4]

трехэтажный комментарий, добавленный Делфи-средой в начало dpr-текста после File -> New.. -> Library, читала ?


begin...end   (2005-08-29 11:42:00) [5]

Используются длинные строки. Поэтому следует добавить модуль ShareMem первым в списки uses библиотеки и файла проекта хост-приложения.


КК   (2005-08-29 11:40:00) [6]

Извините, точки вызова вот так:
@ReadArray := GetProcAddress(LibHandle,'ReadArray');
@EraseArray := GetProcAddress(LibHandle,'EraseArray');


Наверх

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