Форум: "Основная";
Текущий архив: 2005.09.18;
Скачать: [xml.tar.bz2];
Вниз
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.011 c