Сейчас на форуме: UniSoft, laslo, bartolomeo (+5 невидимых) |
eXeL@B —› Программирование —› Проблема с DELPHI DLL |
Посл.ответ | Сообщение |
|
Создано: 09 октября 2011 03:05 · Поправил: Error13Tracer · Личное сообщение · #1 Есть DLL, содержащая класс, при запуске всё прекрасно работает через интерфейсы, только при выгрузке прога падает, при том не каждый раз. Явно что-то не так делаю, посмотрите и предложите пути решения проблемы. Сорцы в атаче (не спамер, под собственные нужды) Интересует именно почему падает и пути решения. Проблемы не только с этим модулем fc6a_09.10.2011_EXELAB.rU.tgz - MailRuSRC.7z __UPD__ Исходник на Pascal, IDE Delphi 7 |
|
Создано: 09 октября 2011 11:10 · Личное сообщение · #2 |
|
Создано: 09 октября 2011 11:22 · Личное сообщение · #3 |
|
Создано: 09 октября 2011 11:41 · Личное сообщение · #4 Методы Free и Destroy недоступны через интерфейсы, освобождаю объекты классов, присваиваю в последующем значение nil (null). Судя по доступной мне информации, всё остальное должна сделать система. Пока есть хоть один объект того же типа она держит в системе код, как пропадает, выгружает. Насчёт строк - ну так получилось |
|
Создано: 09 октября 2011 11:46 · Личное сообщение · #5 |
|
Создано: 09 октября 2011 11:58 · Поправил: Error13Tracer · Личное сообщение · #6 |
|
Создано: 09 октября 2011 12:10 · Личное сообщение · #7 Error13Tracer пару идей 1) MailRu.dpr: exports CreateMailRuRegger; << криатор есть, а где уничтожитель? я всегда делаю create/destroy из области видимости одной подсистемы (по другому - тот кто создает автоматически обязан и удалять обект, не всегда конечно так можно сделать, но если можно - надо) 2) как насчет многопоточности - есть ли она у вас? (тоесть могут ли два потока одновременно создавать обект через CreateMailRuRegger()? |
|
Создано: 09 октября 2011 12:17 · Личное сообщение · #8 Создать объект в данном случае проще чем уничтожить. Кактакового уничтожения вообще не предусмотрено, только обнуление используемого объекта, как почитал в гугле... Многопоточность реализована и тоже прекрасно работает, только до момента выгрузки DLL опять же... Тут не единичный случай, проги при работе с сетью именно падают. Стал уже грешить на Indy... |
|
Создано: 09 октября 2011 12:23 · Личное сообщение · #9 |
|
Создано: 09 октября 2011 12:32 · Личное сообщение · #10 |
|
Создано: 09 октября 2011 13:48 · Личное сообщение · #11 |
|
Создано: 09 октября 2011 15:28 · Поправил: Error13Tracer · Личное сообщение · #12 Виснет при запросе страниц, так Indy-компоненты устроены. Если не врубить антифриз, то пока одна из страниц будет ждать отклика, прога висеть будет. __UPD__ Проблема не в зависе, с этим разобраться можно. Суть в том, почему падает. Кусочек кода подкиньте лучше как правильно выгрузить такой модуль. С интерфейсами недавно познакомился, не разобрался ещё толком. Работать работают, только выгрузка не робит как положено и инфы маловато. Или ткните где почитать про выгрузку именно PS: гуглом пользоваться умею, нужен конкретный совет __UPD1__ Читал что у Delphi это возможно из-за собственной обработки памяти, не знаю на сколько достоверная информация, в компиль не лез |
|
Создано: 09 октября 2011 15:59 · Личное сообщение · #13 |
|
Создано: 09 октября 2011 20:49 · Личное сообщение · #14 |
|
Создано: 09 октября 2011 21:08 · Личное сообщение · #15 Не знаю, как в Дельфи7, но еще Дельфи6 обязывала при использовании объектов из длл первым юнитом в ее проект включать ShareMem.pas Code:
Итак, унимание, вопрос: Ты так сделал? |
|
Создано: 09 октября 2011 23:18 · Поправил: ToBad · Личное сообщение · #16 |
|
Создано: 10 октября 2011 01:01 · Поправил: Error13Tracer · Личное сообщение · #17 |
|
Создано: 10 октября 2011 01:44 · Личное сообщение · #18 Error13Tracer насчёт System.IsMultiThread:=true; я серьёзно, когда речь касается потоков глюки бывают когда угодно и где угодно, вот я как |
|
Создано: 10 октября 2011 09:09 · Поправил: Error13Tracer · Личное сообщение · #19 |
|
Создано: 10 октября 2011 10:08 · Поправил: vden · Личное сообщение · #20 Error13Tracer А как падает ? Access Violation? Можно что-то по адресу узнать? Если memory leak, то в Delphi 7 нет ReportMemoryLeaksOnShutdown, и лик не вызовет сбоя. Если используешь sharemem, то строки должны очищаться правильно. Также можно передавать строки как в WinApi, хотя проблема скорее не в этом. Очистка интерфейса должна происходить сама собой при выходе из scope, или принудительно присвоив nil при завершении. Важно не делать cast'ов которые компилятор не может отследить. Возможно проблема действительно с Indy. В поставке Delphi 7 indy действительно глючная, нужно убедиться что всё закрывается и очищается. Особенно такие проблемы у меня были с SSL. |
|
Создано: 11 октября 2011 15:40 · Поправил: Ra1n0 · Личное сообщение · #21 |
|
Создано: 02 ноября 2011 14:19 · Поправил: Error13Tracer · Личное сообщение · #22 Не решено, но закрыто, почитаю что посоветовали и погуглю получше UPD: Здесь грабли глубже лежали, FastShareMem и WideString решили проблему. Дабы никто больше не наступал на подобные грабли, рекомендую Всем Delphi программерам первым модулем включать FastShareMem (codexterity.com). После подобных обновлений грабли пропадают. (Не забываем выгружать по Component := nil) Ну это конечно на любителя, но всёже решение нашлось |
eXeL@B —› Программирование —› Проблема с DELPHI DLL |
Эта тема закрыта. Ответы больше не принимаются. |