Текущий архив: 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.54 MB
Время: 0.007 c