Главная страница
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.741 c
3-1123148932
Koralnik
2005-08-04 13:48
2005.09.18
Запрос в базу данных удаленного сервера


14-1124725089
Santrope
2005-08-22 19:38
2005.09.18
Как запретить вход в домен нескольким пользователям ?


14-1124977560
OldNaum
2005-08-25 17:46
2005.09.18
Новоуральск )


3-1123133145
Nata2
2005-08-04 09:25
2005.09.18
ADOStorecProd


1-1124915937
Ginger
2005-08-25 00:38
2005.09.18
Готовый парсер xml-документа в описание формы