Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.013 c
2-1123913161
Гость22
2005-08-13 10:06
2005.09.18
Как, зная начальную дату и колличество месяцев, определить...


14-1125128856
redlord
2005-08-27 11:47
2005.09.18
win 2003 server + mssql 2005 server


1-1125213842
Jerry
2005-08-28 11:24
2005.09.18
Нужно конвертировать png2ico


1-1124902261
ArtemESC
2005-08-24 20:51
2005.09.18
Активировать Button


1-1124864836
Dr. Andrew
2005-08-24 10:27
2005.09.18
Как записать в *.ini файл свойство шрифта Style?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский