![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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');