Страница 1 из 1

обработка объектов при помощи DLL

Добавлено: 18 окт 2009, 14:02
Kompuklumba
К сожелению не смог найти аналогичных тем или вопросов в сети. Сразу прошу извинения, если задам тупой вопрос.

Опишу в чем суть проблемы. Есть библиотечка с модальным окном, я ее одгружаю динамически и вызываю окно, в которое передаю экземпляр своего класса. После освобождения по FreeLibrary исчезает и сам экземпляр.

[syntax='Delphi']
// GD - основной объект с которым работаю внутри главного модуля
// SubGD - нужен для того чтоб не передавть на прямую GD(просто думал
//что из- за прямой передачи касяк)

procedure TFrmMain.ActGenDataExecute(Sender: TObject);
var
SubGD: TGeneralData;
HandleProc: THandle;
ShowGD : procedure(AppHandle:THandle; var GD:TGeneralData;
AdmDB: string;CityDB:string); stdcall;

begin
// подгружаю DLL
HandleProc := LoadLibrary(GenData);
if HandleProc > 32 then
begin
// создаю еще один экземпляр класса (так как через основной вообще
// не работает)

SubGD := TGeneralData.Create;
SubGD.Assign(GD);
// подгружаю метод библиотеки
ShowGD := GetProcAddress(HandleProc,'ShowGenData');
// вызываю
ShowGD(Application.Handle,SubGD, DBDir + DBAdmRn, DBDir + DBCity);
// передаю данные в основной экземпляр
GD.Assign(SubGD);
// грохаем лишний объект
SubGD.Free;
SubGD := nil;

Application.ProcessMessages;
// тут еще пока существует объект GD
FreeLibrary(HandleProc);
// а тут уже нет
end;
end;
[/syntax]

Прошу строго не судить за такой вопрос, я по образованию строитель

Re: обработка объектов при помощи DLL

Добавлено: 20 окт 2009, 10:53
atavin-ta
Библиотека твоя, или чужая? Если чужая, то открыт ли код? Судя по всему, глюк в самой библиотке: закрываясь, она удаляет объект, переданный ей приладой, а должна удалять только то, что создала сама.
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
&quot писал(а):Сразу прошу извинения, если задам тупой вопрос.
А это зря.

Re: обработка объектов при помощи DLL

Добавлено: 21 окт 2009, 09:40
Kompuklumba
Вопрос разрешился! надо было сменить менеджер памяти на ShareMem!

Ббиблиотека моя.

Пока искал ответ на свой вопрос наткнулся на такую штуку как FastMM, может кто подскажет как с помощью нее определять утечки памяти? а то по 30-40 Кб улетает

Re: обработка объектов при помощи DLL

Добавлено: 21 окт 2009, 09:55
Duncon
Проще в COM архитектуру было ударится интерфейсы рулят..
Менеджерами не пользовался никогда хватает
ReportMemoryLeaksOnShutdown := True;
Он обычно показывает какой элемент течёт, лучший способ борьбы с утечками не допскать ошибок, скорее всего какая-то переменная не разрушенной осталась, отрубай участки кода смотри исчезнет ли утечка - исчезла значит на этом участке... В коде глупость заметил SubGD := nil; в том числе зачем создавать побочный объект если можно сразу вгрузиться в основнй...

Re: обработка объектов при помощи DLL

Добавлено: 21 окт 2009, 11:48
Kompuklumba
Duncon писал(а): в том числе зачем создавать побочный объект если можно сразу вгрузиться в основнй...
Создал для того чтобы не терять тот, который передаю, думал поможет, как оказалось нет...

А утечка происходит даже при использовании простого класса (порожденного от TPersistent) в которм всего несколько полей типа integer. Удаляю по free, но к сожалению утечка есть... может я придераюсь к этим 10 Кб? но мне это не нравится.

Re: обработка объектов при помощи DLL

Добавлено: 21 окт 2009, 12:10
Duncon
В курсе что FastMM нужно первым ставить в uses? (возможно из-за этого и косячит)

Re: обработка объектов при помощи DLL

Добавлено: 21 окт 2009, 12:24
atavin-ta
&quot писал(а):может я придераюсь к этим 10 Кб?
Утечки быть не должно вообще. Даже в 1 байт. Поэтому борись с ней, пока не исчезнет.