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

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Kompuklumba
Сообщения: 3
Зарегистрирован: 18 окт 2009, 13:43

К сожелению не смог найти аналогичных тем или вопросов в сети. Сразу прошу извинения, если задам тупой вопрос.

Опишу в чем суть проблемы. Есть библиотечка с модальным окном, я ее одгружаю динамически и вызываю окно, в которое передаю экземпляр своего класса. После освобождения по 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]

Прошу строго не судить за такой вопрос, я по образованию строитель
atavin-ta
Сообщения: 585
Зарегистрирован: 30 янв 2009, 06:38

Библиотека твоя, или чужая? Если чужая, то открыт ли код? Судя по всему, глюк в самой библиотке: закрываясь, она удаляет объект, переданный ей приладой, а должна удалять только то, что создала сама.
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
&quot писал(а):Сразу прошу извинения, если задам тупой вопрос.
А это зря.
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
Kompuklumba
Сообщения: 3
Зарегистрирован: 18 окт 2009, 13:43

Вопрос разрешился! надо было сменить менеджер памяти на ShareMem!

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

Пока искал ответ на свой вопрос наткнулся на такую штуку как FastMM, может кто подскажет как с помощью нее определять утечки памяти? а то по 30-40 Кб улетает
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Проще в COM архитектуру было ударится интерфейсы рулят..
Менеджерами не пользовался никогда хватает
ReportMemoryLeaksOnShutdown := True;
Он обычно показывает какой элемент течёт, лучший способ борьбы с утечками не допскать ошибок, скорее всего какая-то переменная не разрушенной осталась, отрубай участки кода смотри исчезнет ли утечка - исчезла значит на этом участке... В коде глупость заметил SubGD := nil; в том числе зачем создавать побочный объект если можно сразу вгрузиться в основнй...
[syntax=Delphi] [/syntax]
Kompuklumba
Сообщения: 3
Зарегистрирован: 18 окт 2009, 13:43

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

А утечка происходит даже при использовании простого класса (порожденного от TPersistent) в которм всего несколько полей типа integer. Удаляю по free, но к сожалению утечка есть... может я придераюсь к этим 10 Кб? но мне это не нравится.
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

В курсе что FastMM нужно первым ставить в uses? (возможно из-за этого и косячит)
[syntax=Delphi] [/syntax]
atavin-ta
Сообщения: 585
Зарегистрирован: 30 янв 2009, 06:38

&quot писал(а):может я придераюсь к этим 10 Кб?
Утечки быть не должно вообще. Даже в 1 байт. Поэтому борись с ней, пока не исчезнет.
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
Ответить