Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.18;
Скачать: CL | DM;

Вниз

DLL и TList   Найти похожие ветки 

 
КК   (2005-08-29 11:37) [0]

Я создаю библиотеку 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 11:40) [1]

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


 
Digitman ©   (2005-08-29 11:42) [2]

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


 
begin...end ©   (2005-08-29 11:42) [3]

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


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

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


 
Digitman ©   (2005-08-29 12:19) [5]

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

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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2005.09.18;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.107 c
14-1124461002
Ji
2005-08-19 18:16
2005.09.18
Загадки от сайта www.try2hack.nl (Засыпался на Java-аплете)


1-1124952793
kyn66
2005-08-25 10:53
2005.09.18
Почему List index out of bounds(-1) ?


11-1107177249
hunn
2005-01-31 16:14
2005.09.18
Модальная форма на чистом KOL


2-1123825161
syte_ser78
2005-08-12 09:39
2005.09.18
консольное приложение?


14-1124946500
Priest
2005-08-25 09:08
2005.09.18
Безопасность макросов в экселе