Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.03.31;
Скачать: CL | DM;

Вниз

формы в DLL и как с ними бороться   Найти похожие ветки 

 
dj next   (2003-03-13 17:32) [0]

Товарисчи!
Ж..а в следующем:
Некое приложение подгружает динамически DLL в которой
создаётся некая форма
После работы с ПРИЛОЖЕНИЕМ то бишь при его закрытии
возникает какой-то страшенный ЭКСЕПШН да не один а сразу много
(2 обычно) Обычно - потому что каждый раз по-разному!
Подозреваю что дело в ресурсах но что делать незнаю
Поможите плз чем могете!


 
mrcat ©   (2003-03-13 17:46) [1]

могу помочь финансами, но не хочу...


 
dj next   (2003-03-13 17:53) [2]

Неужели кроме финансов и помочь нечем?


 
Игорь Шевченко ©   (2003-03-13 17:55) [3]

Тейксейра, Пачеко: "Delphi 5, руководство разработчика"


 
dj next   (2003-03-13 18:02) [4]

Ладно хоть не букварь(


 
AlexanderSK ©   (2003-03-13 18:34) [5]

Покажи код открытия Dll и код закрытия Dll!


 
dj next   (2003-03-13 19:31) [6]

Открываю: h:=LoadLibrary(тра-ля-ля);
Закрываю: FreeLibrary(тра-ля-ля);
Удивительно но факт)


 
dj next   (2003-03-13 19:32) [7]

тока во второй строке не тра-ля-ля а h


 
Digitman ©   (2003-03-14 09:19) [8]


> какой-то страшенный ЭКСЕПШН


конечно - страшенный ! у него ни класса нет, ни текста сообщения об ошибке, ни адреса - ни-че-го !
вот ведь беда какая)... путь тут один - веревка и мыло)


 
dj next   (2003-03-14 10:05) [9]

смешно?
Короче, как правильно освободить ресурсы в DLL?


 
dj next   (2003-03-14 10:07) [10]

по понятиям чиста))


 
NailS ©   (2003-03-14 10:07) [11]

http://www.delphikingdom.com/helloworld/plugins.htm


 
Digitman ©   (2003-03-14 10:19) [12]


> dj next


Смешно, говоришь ?
Нет, не смешно ... Грустно !

Грустно от того, что взялся ты за не самую простую задачу, а элементарных вещей не знаешь.

Если уж ты получил сообщение об исключении, потрудись хотя бы точно, кратко и внятно описать его, коль сам не в состоянии сообразить и просишь помощи ! Дискуссия по вопросу твоему по сей момент выглядит не более как обсуждение письма Ваньки Жукова на деревню дедушке.

Еще раз заостряю твое внимание - исключение имеет вполне определенные признаки, которые ты видишь на экране, как минимум - текст сообщения. так вот и будь столь любезен - приведи ДОСЛОВНЫЕ тексты получаемых исключений, при каких условиях эти исключения возникают. Телепатов здесь нет !


 
dj next   (2003-03-14 10:31) [13]

Access violation
изредка Too many concursive exceptions


 
dj next   (2003-03-14 10:32) [14]

Возникает тока если создаю форму
если не создаю всё ок


 
Digitman ©   (2003-03-14 10:40) [15]


> dj next


Ну что ты как детский ребенок-то ?
Access violation ... дальше-то что в сообщении ? Дословно ? Это ж не для Пушкина сообщение - для тебя !!!! Чтобы ты смог по этой инф-ции отыскать точное место в коде, где происходит исключение !


 
Anatoly Podgoretsky ©   (2003-03-14 10:47) [16]

Брось ты это дело


 
Digitman ©   (2003-03-14 11:09) [17]


> Anatoly Podgoretsky


Гнилое, думаешь ?)


 
dj next   (2003-03-14 11:13) [18]

004066B1 6800040000 push $00000400
малый дамп не привести?


 
Digitman ©   (2003-03-14 11:17) [19]


> dj next


хочешь сказать - AV at address 004066B1... ? Быть того не может, эта операция не может вызвать AV


 
dj next   (2003-03-14 11:28) [20]

гадом буду
функцыя SetString в system


 
Danilka ©   (2003-03-14 11:29) [21]

dj next (14.03.03 11:28)
только не надо быть гадом, их и так слишком много.


 
dj next   (2003-03-14 11:32) [22]

о нашел пардон
ошибка в RtlFreeHandle в ntdll


 
Digitman ©   (2003-03-14 11:33) [23]


> гадом буду


обязательно будешь) ... пока не умеришь свои публичные упражнения в жаргоне дворовом !


а вот и SetString (D5)

procedure _SetString{var s: ShortString: buffer: PChar; len: Integer};
asm
{ -> EAX pointer to string }
{ EDX pointer to buffer }
{ ECX len }

MOV [EAX],CL
TEST EDX,EDX
JE @@noMove
XCHG EAX,EDX
INC EDX
CALL Move
@@noMove:
end;


что-то не вижу я здесь никаких push"ей)


 
dj next   (2003-03-14 11:33) [24]

(а первая черт с ней)
ну и чего это за RtlFreeHandle?


 
Digitman ©   (2003-03-14 11:38) [25]


> dj next


Не городи ерунды ! По адресам 004XXXXX никаких NTDLL быть не может, это - ВАП, распределенное под прикладной код приложения, а не под сист.библиотеку


Ищи строчку прикл.кода (search | find error)


 
dj next   (2003-03-14 11:43) [26]

неа адрес уже другой - 77f84C1C
а тот хрен с ним горворю ж



 
Ihor Osov'yak ©   (2003-03-14 11:44) [27]

2 Digitman © (14.03.03 11:17)

А почему же? Если указатель стека перед этим хр.. знает куда натравить? Не умышленно, конечно. А по причине ОЧеньУМЕЛЫХ ручек в комбанации с нежеланием книжки читать..


 
Digitman ©   (2003-03-14 11:54) [28]


> Ihor Osov"yak


При такой постановке вопроса это надо быть я не знаю кем, чтобы ничерта не понимать в принципах отладки Делфи-проектов и, в то же время, отлично ориентироваться в маш.коде, asm"е и манипулировать стеком "вручную")


Согласен, но вероятность сего настолько мизерна, что даже не стоит рассматривать всерьез


 
dj next   (2003-03-14 12:02) [29]

При чем тут принципы отладки?!
Проблема - СТАНДАРТНАЯ
каким образом освободить ресурсы занимаемые в DLL а конкретно
ФОРМУ чтоб не глючило и сидя в Delphi
Вы ж мастера типа ДОЛЖНЫ знать каким образом D распоряжается ресурсами и как их нужно освобождать в какой последовательности и т д ...блин


 
stone ©   (2003-03-14 12:07) [30]

dj next (14.03.03 12:02)

Ты дурак или прикидываешься. Тебе же ясно сказали покажи код вызова и освобождения DLL, не только строчку FreeLibrary, а всю процедуру. Или ты думаешь что тут все телепаты? Я просто уверен, что проблема в кривых руках.


 
Digitman ©   (2003-03-14 12:09) [31]


> При чем тут принципы отладки?!
> Проблема - СТАНДАРТНАЯ


При том, что, search | find error, указывающий на некий адрес ВАП, распределенном под твою DLL, покажет строчку, исключение при выполнении которой является первичным, все последующие исключения - лишь следствие первого.
вот твоя задача и состоит в том, чтобы, пользуясь встроенным отладчиком, локализовать эту строчку ! а мы уж тут иссследуем проблему при ее выполнении и дадим соотв.рекомендации


 
Ihor Osov'yak ©   (2003-03-14 12:19) [32]

2 Digitman © (14.03.03 11:54)

> Согласен, но вероятность сего настолько мизерна, что даже не стоит рассматривать всерьез

Да нет, вот схема довольно вероятной ошибки: делаем move по "левому указателю", или тривиальное присваивание по такому же левому типизированому указателю, который случайно на область стека смотрит, "случайно" затираем адрес возврата с процедуры, как следствие после выхода с процедуры управление получает "левый код" (конечно, av уже можно здесь получить.. но может и пронести и удачно передать управление хр.. знает куда)... Ну а там в том коде какая-то химия с esp... Ну и далее тоже с определенной вероятностью имеем av на безобидном push...

Согласен, маловероятно, но при особом стараниии иногда можно нарваться...

ЗЫ - хотя в хазаина ветки проблема вероятнее всего не в том..

Зы2 - несколько лет назад наблюдал ситуацию, когда по похожей схеме один программер затирал стек возврата только в случае определенных входных данных.. А программа у него уже работала почти полгода... Но вот пошли специфичиские данные...
Конечно, компилятор ему давал предупреждение, что указатель может быть неинициализирован.. Но разве "прохвесионалы" на варнинги и хинты смотрят :-)


 
Digitman ©   (2003-03-14 12:24) [33]


> Ihor Osov"yak


Да ладно тебе !) Какой там move() у автора может быть, если он элементарно не понимает, где, что, как и в какой последовательности у него происходит - то ли в хост-процессе то ли в библ-ке... сиди тут и гадай)))


 
dj next   (2003-03-14 12:25) [34]

1. есть форма. в unit"е. класс скажем TZHOPA и переменная там же
var ZHOPA: TZHOPA; // unit UZHOPA.PAS
2. есть DLL
там написано что-то типа:

uses UZHOPA;
...
procedure fuck_on(...
begin
ZHOPA:=TZHOPA.Create(nil);

тра-ля-ля...

ZHOPA.Release;
ZHOPA:=nil;
end;

3. есть приложение где есть строки типа:
procedure TModule.MLoad;
begin
h:=LoadLibrary...
@proc:=GetProcAddress...

(есть всяко что-то вроде типа модуля TModule где
хранится хэндл и указатели на процедуры

end;
...и в конце концов ентот Module ..

Module.Unload где Unload

procedure TModule.Unload;
begin
FreeLibrary(Self.h);
end;
УСЁ. Теперь ФАБУЛА:
запускаем приложение вызываем модуль
модуль грузится форма появляется
работаем с формой закрываем её нафик
сидим ещё полчаса пьём кофе
тыкаем закрыть приложение - ВОТ ТУТ И НАЧИНАЕТСЯ САМОЕ ИНТЕРЕСНОЕ
Понятно?


 
Ihor Osov'yak ©   (2003-03-14 12:27) [35]

2 dj next (13.03.03 17:32)

Прочитай еще раз внимательно Digitman © (14.03.03 10:19)

Задача в принціпе не столь сложная, но по пути есть несколько грабель... А гадать на которые ты наступил - нет исходных данных
и желания...

Зы - формы в dll пихать пока не будет четкого понимания что там в VCL происходит, имхо, не стоит...


 
Ihor Osov'yak ©   (2003-03-14 12:39) [36]

2 dj next (14.03.03 12:25)

Блин. Ты уже ...


С твоего примера даже не понятно отображаешь ты форму модально или нет. Для длл это существенно. Не понятно, как ты уничтоженшь форму и сколько раз ты делаешь это...

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

Сорри за резкость тона..


 
Digitman ©   (2003-03-14 12:41) [37]

ба, да тут еще и интерфейсы !!!!!

сразу - страшное подозрение :

procedure fuck_on(...
begin
ZHOPA:=TZHOPA.Create(nil); // refcount = 1 ?

тра-ля-ля... // refcount вряд ли изменился

ZHOPA.Release; // refcount = 0, тут же - destroy
ZHOPA:=nil; // а вот здесь, чует мое сердуе, - и AV родимый сидит !
end;


 
dj next   (2003-03-14 12:45) [38]

1. форма не модальная
2. из примера ВИДНО что создаётся и убивается столько раз сколько
обращений к функции fuck_on
3 Про Release прочитал в Кулибе (Статейка про ресурсы в DLL)
Можно поставить Free - жопа та же

PS
Пусть будет резкость
в тему бы только
а не просто от не...я делать


 
Anatoly Podgoretsky ©   (2003-03-14 12:48) [39]

Digitman © (14.03.03 11:09)
Не то что бы гнилое, но проблем хватает, особенно если нет понимания и нужды


 
Digitman ©   (2003-03-14 12:50) [40]


> прочитал в Кулибе


а в той же "Кулибе" ты не удосужился прочитать хоть что-то про обработку исключений ? про try..except ?

хоть бы тело своей подозрительной fuck_on() на время отладки защитил этим блоком)... нет ведь ! гораздо познавательней изощряться в жаргоне и изобретении дурацкизх идентификаторов а-аля ZHOPA, fuck_on e.t.c.


 
Ihor Osov'yak ©   (2003-03-14 12:52) [41]

2 Digitman © (14.03.03 12:41)

> ба, да тут еще и интерфейсы !!!!!
Release не только в интервейсах есть.. :-) - говорю ж ОЧеньУМЕЛЫЕ ручки

2 dj next (14.03.03 12:45)

> 2. из примера ВИДНО что создаётся и убивается столько раз сколько
обращений к функции fuck_on

Это тебе только так кажется..

Перекрой BeforeDestruction и поставь там тривиальный windows.MessageBox.. Очень вероятно, что очень удивишся...

Зы - также твой код допускает вызов деструктора и в случае, если форма почему-то не создалась (ошибка в конструкторе)...








 
dj next   (2003-03-14 12:52) [42]

ВСЁ завёрнуто в try..except! (читать я умею еще пока)


 
Игорь Шевченко ©   (2003-03-14 12:55) [43]

dj next (14.03.03 12:25)

Тебе ж, несмышленому, сказали - Тейксейра, Пачеко. Там как раз случаи с формами в DLL подробно разбираются.


 
Ihor Osov'yak ©   (2003-03-14 13:00) [44]

2 dj next (14.03.03 12:52)

А вот все завивать не надо.. Завивать нужно то что нужно и осознано. Если не осознано - то лучше вообще не завивать - но это уже имхо...

в твоем примере более кореектно было бы


ZHOPA:=TZHOPA.Create(nil);
try
тра-ля-ля...
finally
ZHOPA.Release;
ZHOPA:=nil;
end;

или
try
ZHOPA:=TZHOPA.Create(nil);
try
тра-ля-ля...
finally
ZHOPA.Release;
ZHOPA:=nil;
end;
except
MessaheBox(0,"Warning","Oй",MB_OKCancel+MB_ICOMWARNING");
end


Это верно, если тра-ля-ля... подразумевает ShowModal и сама форма сама сябя не уничтожает (есть и такой вариант)..

Если это не так - то то, что я писал выше в этом постинге - не совсем верно. Или даже совсем не верно. Но я не телепат..


 
Ihor Osov'yak ©   (2003-03-14 13:04) [45]

2 Игорь Шевченко © (14.03.03 12:55)

Дык основная проблема в том, имхо, что чел или читать не умеет или не хочет.. Последнее лечится трудно..


 
Anatoly Podgoretsky ©   (2003-03-14 13:09) [46]

Digitman © (14.03.03 12:50)
> прочитал в Кулибе

Кулиба создана на основе наших же советов, как правильных, так и не правильных, а последних там хватает и к сожалению почему практика их применения шире правильных, один совет по инсталляции БДЕ методом копирования длл в папку с программами чего стоит.


 
dj next   (2003-03-14 13:09) [47]

в BeforeDestruction ничего удивительного нет
зато пока ковырялся понял что создаться форма почему-то
может тока один раз второй раз вызываю создающую функцию - AV


 
dj next   (2003-03-14 13:15) [48]

щас убрал всё кроме Create и Free - работает!
всё дело в коде между...
то есть в тра-ля-ля!

вот тока почему?! там с парой Memo и Edit"ов работаю
и всё((


 
Digitman ©   (2003-03-14 13:15) [49]

о , госссподи , воля твоя !

ну поставь ты брейкпойнт на строчке

ZHOPA:=TZHOPA.Create(nil);

да оттрассируй конструирование формы !

ну в чем проблема-то ? ну не понимаю я .... кулиба какая-то, не кулиба....


 
Digitman ©   (2003-03-14 13:17) [50]


> там с парой Memo и Edit"ов работаю


трассируй тогда все что между конструктором и деструктором !


 
Ihor Osov'yak ©   (2003-03-14 13:18) [51]

Блин, говорил себе, что сюда уже не полезу, но:


dj next (14.03.03 12:45)
1. форма не модальная


2.

procedure fuck_on(...
begin
ZHOPA:=TZHOPA.Create(nil);

тра-ля-ля...

ZHOPA.Release;
ZHOPA:=nil;
end;


Если форма не модальная, то есть ты отображаешь ее не через ShowModal - то ты ничего на экране даже не увидишь... Если ты все же чего то видишь, то ты думаешь одно, делаешь другое, а говоришь тут совсем о третьем..

Так что сорри.



 
dj next   (2003-03-14 13:21) [52]

2 Ihor Form.Show знаешь такой метод?


 
Anatoly Podgoretsky ©   (2003-03-14 13:29) [53]

Digitman © (14.03.03 13:15)
Кулиба, не кулиба, но точно название формы :-)


 
Ihor Osov'yak ©   (2003-03-14 13:31) [54]

2 dj next (14.03.03 13:21)

Я много чего знаю (по сравнению с тобой). Имхо даже то, чего тебе и не снилось.

Разбирайся со своими багами сам, а если хочешь, чтобы тебе помоголи - четко отвечай на вопросы. Те говорили, привести код? Ты его привел?

Догадыватся что ты там наворял?

Для особо одаренный обьясняю:

если после вызова Form.Show вызвать сразу же Form.Free то она не должна отображаться на екране заметное время (вернее будет отображатся несколько мгновений между Show и Free.

Если это у тебя не так, то ты заставил работать VCL не так, как предусматривали ее создатели.
Один из вариантов этого достичь
f:=TForm.Create;
f.Show;
PostMessage(f.Handle, /// - это наверно необязательное условие, нет времени експериментировать
Application.ProcessMessages; // главное условие фошки, особенно в dll
f.Free;

И будешь в таком шедевре баги до конца дней своих ловить или до просветления...











 
Digitman ©   (2003-03-14 13:40) [55]


> Anatoly Podgoretsky



> Кулиба создана на основе наших же советов, как правильных,
> так и не правильных


Вот ведь беда - не в курсе я , что такое кулиба, не ходил туда .. А, может, и к лучшему)...
Жуть там, наверно, страшная ?)... Лучше уж и не пойду туда вовсе, коль такие дела творятся там).. на поверку-то) ...
Насоветуешь тут, а потом своими же граблями по своему же по лбу кааааак - хрясь !!!!

Как сам думаешь, а ?)


 
dj next   (2003-03-14 13:43) [56]

между идёт нехилая работа с Interbase и вызывающим приложением))))))
лана методом исключения буду выяснять что глючит...


 
Digitman ©   (2003-03-14 14:00) [57]

аминь


 
Anatoly Podgoretsky ©   (2003-03-14 14:11) [58]

Digitman © (14.03.03 13:40)
Чего тут думать, абсолютно правильное решение, больше времени потеряешь на поиск, еще и обиднее будет если совет неверный, а это непонятно из за уровня знаний.


 
Digitman ©   (2003-03-14 16:14) [59]

))

эй, пацаны ! или как вас там ) .. кто там кулибой заведует "нехило")

есть предложение увековечить сию дискуссионный перл на скрижалях кулибоистории !)

начали за здравие ("формы в DLL и как с ними бороться"),
кончили за упокой (тра-ля-ля = "нехилая работа с Interbase и вызывающим приложением")

во как !)


 
Ihor Osov'yak ©   (2003-03-14 17:32) [60]

да уж, иллюстрация к теме "умение задавать вопросы", а также демонстрация искусства уходить от наводящих (вопросов) и игнорирование ответов то делу - хотя бы Игорь Шевченко © (13.03.03 17:55),
после которого уже можно было бы закрыть разговор :-(.


 
Ihor Osov'yak ©   (2003-03-14 17:35) [61]

зы - мне стидно.. Сорвался..


 
Digitman ©   (2003-03-14 17:55) [62]


> Ihor Osov"yak


а мне грустно... очень ... за изрядно поредевший строй сегодняшних и будущих настоящих Инеженеров.... (


 
Ihor Osov'yak ©   (2003-03-14 18:20) [63]

Понимаю. И присоединяюсь.



Страницы: 1 2 вся ветка

Текущий архив: 2003.03.31;
Скачать: CL | DM;

Наверх




Память: 0.63 MB
Время: 0.016 c
14-100465
Malder
2003-03-10 13:56
2003.03.31
НЕТ, ну БЛИН ! Я в ШОКЕ


1-100236
Скворцов Александр
2003-03-20 14:40
2003.03.31
Как остановить работу программы до нажатия кнопки на форме?


1-100217
VP
2003-03-20 12:43
2003.03.31
Эмуляция двойного клика на объекте.


6-100363
k-sergey
2003-02-07 08:12
2003.03.31
TIdSMTP- отправляю письмо...а у нас рокси..


1-100222
cult
2003-03-20 12:35
2003.03.31
Можно ли регулировать у фонта межбуквенный интервал?