Сейчас на форуме: UniSoft, laslo, bartolomeo (+5 невидимых)

 eXeL@B —› Программирование —› Проблема с DELPHI DLL
Посл.ответ Сообщение

Ранг: 18.8 (новичок), 21thx
Активность: 0.030
Статус: Участник

Создано: 09 октября 2011 03:05 · Поправил: Error13Tracer
· Личное сообщение · #1

Есть DLL, содержащая класс, при запуске всё прекрасно работает через интерфейсы, только при выгрузке прога падает, при том не каждый раз. Явно что-то не так делаю, посмотрите и предложите пути решения проблемы. Сорцы в атаче (не спамер, под собственные нужды) Интересует именно почему падает и пути решения. Проблемы не только с этим модулем

fc6a_09.10.2011_EXELAB.rU.tgz - MailRuSRC.7z
__UPD__
Исходник на Pascal, IDE Delphi 7




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 09 октября 2011 11:10
· Личное сообщение · #2

А Free/Destroy точно вызывается перед выгрузкой DLL?

-----
Yann Tiersen best and do not fuck




Ранг: 72.1 (постоянный), 30thx
Активность: 0.050
Статус: Участник

Создано: 09 октября 2011 11:22
· Личное сообщение · #3

Меня терзают смутные воспоминания насчет DelphiMM и необходимости использования его в ДЛЛ-ках при (не вполне здравом) желании передавать/принимать из нее длинные стринги. Ы?



Ранг: 18.8 (новичок), 21thx
Активность: 0.030
Статус: Участник

Создано: 09 октября 2011 11:41
· Личное сообщение · #4

Методы Free и Destroy недоступны через интерфейсы, освобождаю объекты классов, присваиваю в последующем значение nil (null). Судя по доступной мне информации, всё остальное должна сделать система. Пока есть хоть один объект того же типа она держит в системе код, как пропадает, выгружает.

Насчёт строк - ну так получилось




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 09 октября 2011 11:46
· Личное сообщение · #5

Ну так в чем проблема проверить? При DLL_PROCESS_DETACH вывести количество не закрытых объектов.

-----
Yann Tiersen best and do not fuck




Ранг: 18.8 (новичок), 21thx
Активность: 0.030
Статус: Участник

Создано: 09 октября 2011 11:58 · Поправил: Error13Tracer
· Личное сообщение · #6

Спасибо, попробую, отпишусь
Видимо проблемы с выгрузкой. Если у кого есть примерчик правильной выгрузки, подкиньте на любом языке, разберусь =)



Ранг: 512.7 (!), 360thx
Активность: 0.270.03
Статус: Модератор

Создано: 09 октября 2011 12:10
· Личное сообщение · #7

Error13Tracer

пару идей

1) MailRu.dpr:

exports
CreateMailRuRegger; << криатор есть, а где уничтожитель? я всегда делаю create/destroy из области видимости одной подсистемы (по другому - тот кто создает автоматически обязан и удалять обект, не всегда конечно так можно сделать, но если можно - надо)

2) как насчет многопоточности - есть ли она у вас? (тоесть могут ли два потока одновременно создавать обект через CreateMailRuRegger()?



Ранг: 18.8 (новичок), 21thx
Активность: 0.030
Статус: Участник

Создано: 09 октября 2011 12:17
· Личное сообщение · #8

Создать объект в данном случае проще чем уничтожить. Кактакового уничтожения вообще не предусмотрено, только обнуление используемого объекта, как почитал в гугле...
Многопоточность реализована и тоже прекрасно работает, только до момента выгрузки DLL опять же...
Тут не единичный случай, проги при работе с сетью именно падают. Стал уже грешить на Indy...




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 09 октября 2011 12:23
· Личное сообщение · #9

Если работает в потоках, то зачем тогда используется антифриз?

-----
Yann Tiersen best and do not fuck




Ранг: 18.8 (новичок), 21thx
Активность: 0.030
Статус: Участник

Создано: 09 октября 2011 12:32
· Личное сообщение · #10

Без него прога жутко виснет




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 09 октября 2011 13:48
· Личное сообщение · #11

Она не может виснуть, если используются потоки, значит реализация потоков неправильная.

-----
Yann Tiersen best and do not fuck




Ранг: 18.8 (новичок), 21thx
Активность: 0.030
Статус: Участник

Создано: 09 октября 2011 15:28 · Поправил: Error13Tracer
· Личное сообщение · #12

Виснет при запросе страниц, так Indy-компоненты устроены. Если не врубить антифриз, то пока одна из страниц будет ждать отклика, прога висеть будет.
__UPD__
Проблема не в зависе, с этим разобраться можно. Суть в том, почему падает. Кусочек кода подкиньте лучше как правильно выгрузить такой модуль. С интерфейсами недавно познакомился, не разобрался ещё толком. Работать работают, только выгрузка не робит как положено и инфы маловато. Или ткните где почитать про выгрузку именно
PS: гуглом пользоваться умею, нужен конкретный совет
__UPD1__
Читал что у Delphi это возможно из-за собственной обработки памяти, не знаю на сколько достоверная информация, в компиль не лез



Ранг: 512.7 (!), 360thx
Активность: 0.270.03
Статус: Модератор

Создано: 09 октября 2011 15:59
· Личное сообщение · #13

Error13Tracer пишет:
Кактакового уничтожения вообще не предусмотрено, только обнуление используемого объекта

стоит понимать что обект созданный через CreateMailRuRegger воообще не удаляется?
если да тогда ваш код ни при чем.
У вас там := nil или FreeAndNil()?
Покажите еще текст ошибки



Ранг: 18.8 (новичок), 21thx
Активность: 0.030
Статус: Участник

Создано: 09 октября 2011 20:49
· Личное сообщение · #14

sendersu, завтра покажу как выгружаю, сегодня поздно уже =)



Ранг: 72.1 (постоянный), 30thx
Активность: 0.050
Статус: Участник

Создано: 09 октября 2011 21:08
· Личное сообщение · #15

Не знаю, как в Дельфи7, но еще Дельфи6 обязывала при использовании объектов из длл первым юнитом в ее проект включать ShareMem.pas
Code:
  1. { Important note about DLL memory management: ShareMem must be the
  2.   first unit in your library's USES clause AND your project'(select
  3.   Project-View Source) USES clause if your DLL exports any procedures or
  4.   functions that pass strings as parameters or function results. This
  5.   applies to all strings passed to and from your DLL--even those that
  6.   are nested in records and classes. ShareMem is the interface unit to
  7.   the BORLNDMM.DLL shared memory manager, which must be deployed along
  8.   with your DLL. To avoid using BORLNDMM.DLL, pass string information
  9.   using PChar or ShortString parameters. }

Итак, унимание, вопрос: Ты так сделал?




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 09 октября 2011 23:18 · Поправил: ToBad
· Личное сообщение · #16

Попробуйте поставить System.IsMultiThread:=true; и думаю всё наладится. Сам наступал на эти грабли и внятного ответа не получил.

p.s. А вообще ник Error13Tracer не лучший для написания программ, как говорится, как вы лодку назовете так она и поплывет...



Ранг: 18.8 (новичок), 21thx
Активность: 0.030
Статус: Участник

Создано: 10 октября 2011 01:01 · Поправил: Error13Tracer
· Личное сообщение · #17

ToBad, юморите смотрю =) Всё работало =) Посмотрим в будущем =) Тут без обид, чисто в усмешку




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 10 октября 2011 01:44
· Личное сообщение · #18

Error13Tracer насчёт System.IsMultiThread:=true; я серьёзно, когда речь касается потоков глюки бывают когда угодно и где угодно, вот я как мучался с этим.



Ранг: 18.8 (новичок), 21thx
Активность: 0.030
Статус: Участник

Создано: 10 октября 2011 09:09 · Поправил: Error13Tracer
· Личное сообщение · #19

ToBad, юморок был насчёт ника, а за подсказку спасибо =) Только прога всёравно падает, нужно именно как выгружать длл-ку =)
(Позже почитаю по ссылке, на работу валить пора)



Ранг: 112.9 (ветеран), 186thx
Активность: 0.090.01
Статус: Участник

Создано: 10 октября 2011 10:08 · Поправил: vden
· Личное сообщение · #20

Error13Tracer
А как падает ? Access Violation? Можно что-то по адресу узнать?

Если memory leak, то в Delphi 7 нет ReportMemoryLeaksOnShutdown, и лик не вызовет сбоя.

Если используешь sharemem, то строки должны очищаться правильно. Также можно передавать строки как в WinApi, хотя проблема скорее не в этом.

Очистка интерфейса должна происходить сама собой при выходе из scope, или принудительно присвоив
nil при завершении. Важно не делать cast'ов которые компилятор не может отследить.

Возможно проблема действительно с Indy. В поставке Delphi 7 indy действительно глючная, нужно убедиться что всё закрывается и очищается. Особенно такие проблемы у меня были с SSL.



Ранг: 7.7 (гость), 51thx
Активность: 0.010
Статус: Участник

Создано: 11 октября 2011 15:40 · Поправил: Ra1n0
· Личное сообщение · #21

может ты пытаешься выгрузить что-то что уже выгружено, поэтому и падает с AV.

как вариант чтобы тебе не ипать голову,используй при DLL_PROCESS_DETACH, TerminateProcess



Ранг: 18.8 (новичок), 21thx
Активность: 0.030
Статус: Участник

Создано: 02 ноября 2011 14:19 · Поправил: Error13Tracer
· Личное сообщение · #22

Не решено, но закрыто, почитаю что посоветовали и погуглю получше

UPD:
Здесь грабли глубже лежали, FastShareMem и WideString решили проблему. Дабы никто больше не наступал на подобные грабли, рекомендую Всем Delphi программерам первым модулем включать FastShareMem (codexterity.com). После подобных обновлений грабли пропадают. (Не забываем выгружать по Component := nil)
Ну это конечно на любителя, но всёже решение нашлось


 eXeL@B —› Программирование —› Проблема с DELPHI DLL
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати