Главная страница
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.



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

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

Наверх




Память: 0.56 MB
Время: 0.017 c
14-100398
Timber Wolf
2003-03-13 17:44
2003.03.31
А может у кого есть?


3-100178
edst
2003-03-13 09:12
2003.03.31
Где находится isc4.gdb в Linux


1-100277
Николай В.
2003-03-18 14:54
2003.03.31
Уникальность


7-100483
RimD
2003-01-30 21:45
2003.03.31
Круг


14-100391
aga
2003-03-13 16:12
2003.03.31
интересно