Главная страница
    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.6 MB
Время: 0.006 c
7-100488
alex134
2003-02-03 20:18
2003.03.31
Серьезная штука с памятью


6-100366
Dimich1978
2003-02-07 15:01
2003.03.31
У Клиента в сокете остается инфа?


8-100339
drake
2002-12-22 23:58
2003.03.31
Надо ли???


4-100508
KDenis
2003-02-02 14:04
2003.03.31
Как получить сообщения о событиях от мыши и клавиатуры, если


3-100155
ki11er
2003-03-04 21:11
2003.03.31
---|Ветка была без названия|---





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский