К сожелению не смог найти аналогичных тем или вопросов в сети. Сразу прошу извинения, если задам тупой вопрос.
Опишу в чем суть проблемы. Есть библиотечка с модальным окном, я ее одгружаю динамически и вызываю окно, в которое передаю экземпляр своего класса. После освобождения по 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]
Прошу строго не судить за такой вопрос, я по образованию строитель
обработка объектов при помощи DLL
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
Библиотека твоя, или чужая? Если чужая, то открыт ли код? Судя по всему, глюк в самой библиотке: закрываясь, она удаляет объект, переданный ей приладой, а должна удалять только то, что создала сама.
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
А это зря." писал(а):Сразу прошу извинения, если задам тупой вопрос.
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
-
- Сообщения: 3
- Зарегистрирован: 18 окт 2009, 13:43
Вопрос разрешился! надо было сменить менеджер памяти на ShareMem!
Ббиблиотека моя.
Пока искал ответ на свой вопрос наткнулся на такую штуку как FastMM, может кто подскажет как с помощью нее определять утечки памяти? а то по 30-40 Кб улетает
Ббиблиотека моя.
Пока искал ответ на свой вопрос наткнулся на такую штуку как FastMM, может кто подскажет как с помощью нее определять утечки памяти? а то по 30-40 Кб улетает
Проще в COM архитектуру было ударится интерфейсы рулят..
Менеджерами не пользовался никогда хватает
ReportMemoryLeaksOnShutdown := True;
Он обычно показывает какой элемент течёт, лучший способ борьбы с утечками не допскать ошибок, скорее всего какая-то переменная не разрушенной осталась, отрубай участки кода смотри исчезнет ли утечка - исчезла значит на этом участке... В коде глупость заметил SubGD := nil; в том числе зачем создавать побочный объект если можно сразу вгрузиться в основнй...
Менеджерами не пользовался никогда хватает
ReportMemoryLeaksOnShutdown := True;
Он обычно показывает какой элемент течёт, лучший способ борьбы с утечками не допскать ошибок, скорее всего какая-то переменная не разрушенной осталась, отрубай участки кода смотри исчезнет ли утечка - исчезла значит на этом участке... В коде глупость заметил SubGD := nil; в том числе зачем создавать побочный объект если можно сразу вгрузиться в основнй...
[syntax=Delphi] [/syntax]
-
- Сообщения: 3
- Зарегистрирован: 18 окт 2009, 13:43
Создал для того чтобы не терять тот, который передаю, думал поможет, как оказалось нет...Duncon писал(а): в том числе зачем создавать побочный объект если можно сразу вгрузиться в основнй...
А утечка происходит даже при использовании простого класса (порожденного от TPersistent) в которм всего несколько полей типа integer. Удаляю по free, но к сожалению утечка есть... может я придераюсь к этим 10 Кб? но мне это не нравится.
В курсе что FastMM нужно первым ставить в uses? (возможно из-за этого и косячит)
[syntax=Delphi] [/syntax]
Утечки быть не должно вообще. Даже в 1 байт. Поэтому борись с ней, пока не исчезнет." писал(а):может я придераюсь к этим 10 Кб?
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".